Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Przetwarzanie duże ilości danych
phuria
post 21.02.2014, 18:18:45
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


Mam problem z przetworzeniem dużej ilości danych. W pliku (format csv) mam ~250'000 rekordów które potrzebuje dodać do bazy danych. Jednorazowe wprowadzenie takiej ilości danych nie byłoby większym problem, jednak potrzebuję wszystkie dane aktualizować co najmniej 1 raz dziennie, a najlepiej co 60-120 min. Hosting ma ograniczenie na czas wykonywania skryptu do 30s (mogę podnieść tą wartość, jednak i tak są ciągłe problemy z zawieszaniem się skryptu, lub brakiem pamięci). Czas dodawania do bazy danych 1'000 rekordów to ok. 0,5 - 5s.

Nie mam pomysłu jak to podzielić, żeby baza danych to w całości zjadła. Dodam, że pracuję na frameworku Symfony2 (persist() zbieram po 1'000 rekordów, a potem flush() i clear()).
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Pyton_000
post 21.02.2014, 19:09:15
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


pokaż zapytania, pokaż strukturę bazy
Go to the top of the page
+Quote Post
phuria
post 21.02.2014, 20:00:43
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


Pisałem, że pracuje na Symfony2. Doctrine sam sobie zapytania robi. A struktura: 4 pola int, w tym jedno z primary key i 1 pole char(255). Tylko nie wiem co ma struktura do ilości danych smile.gif
Go to the top of the page
+Quote Post
Pyton_000
post 21.02.2014, 21:22:59
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Widzę, czytać umiem smile.gif
Pokaż jak generujesz wsady
Go to the top of the page
+Quote Post
cepa
post 21.02.2014, 23:23:30
Post #5





Grupa: Zarejestrowani
Postów: 125
Pomógł: 7
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


1) Doctrine!? Albo wydajnie albo doctrine tongue.gif Model danych masz trywialny, wiec użyj czegoś lekkiego, a nie płacz, że pamięci brakuje, do tego pewnie w "gołym sql" naklepiesz mniej kodu niż mapując encje itp itd.

2) Nie napisałeś jaka baza, domyślam się, że pewnie MySQL. Nie możesz użyć czegoś co się dużo bardziej sprawdza do szybkiego wpychania danych jak np: Apache Cassandra? Łyknie znacznie więcej niż twoje 250k upsertów.

3) Spróboj użyć kolejki, gearman, rabbitmq itp, z crona generujesz taski do i worker(y) wrzucają szczątkowe dane, dodatkowo masz kontrole ile tych danych wpada.

4) PHP średnio nadaję się do przetwarzania w tle. Na poważnie, to zainteresuj się tematem hadoop.

5) Zmien shared hosting na vps / dedyk.


--------------------
Go to the top of the page
+Quote Post
phuria
post 23.02.2014, 11:09:34
Post #6





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2013

Ostrzeżenie: (0%)
-----


Ad 1. Na wydajności mi nie zależy, byle tylko się wykonało wszystko. Dodatkowo później jeszcze będę chciał coś sprawdzać przed dodaniem każdego rekordu.

Ad 2. Tak MySQL. Niestety jakbym mógł coś szybszego użyć to bym tego użył.

Ad 3. Nie mogę niestety niczego doinstalować do php na tym hostingu.

Ad 4, 5. Jak zacznie to co robię przynosić jakiekolwiek zyski, to zainwestuje w chmurę, no ale do tego czasu trzeba brać to co dają.


Rozwiązałem ten problem w następujący sposób:
Skrypt dodaje po kilka tysięcy rekordów, zapisuje numer ostatniego dodanego rekordu do bazy danych. Następnie kończy działanie, jednocześnie uruchamiając się ponownie (zaczynając w miejscu, w którym ostatnio skończył). I tak w kółko, dopóki nie dojdzie do końca pliku.

Oprócz tego zrezygnowałem z encji, na rzecz własnych zapytań. Dzięki temu mogę jeszcze zaoszczędzić trochę czasu, wyłączając na czas dodawania rekordów sprawdzanie kluczy.

Ten post edytował phuria 23.02.2014, 11:16:16
Go to the top of the page
+Quote Post
Pyton_000
post 23.02.2014, 11:33:20
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Cytat
Skrypt dodaje po kilka tysięcy rekordów,

na raz czy w pętli smile.gif
Możesz jeszcze opóźnić regenerowanie indeksów
Go to the top of the page
+Quote Post
phpmack
post 4.06.2014, 10:11:09
Post #8





Grupa: Zarejestrowani
Postów: 55
Pomógł: 1
Dołączył: 11.06.2011

Ostrzeżenie: (0%)
-----


Cytat(phuria @ 23.02.2014, 12:09:34 ) *
Ad 1. Na wydajności mi nie zależy, byle tylko się wykonało wszystko. Dodatkowo później jeszcze będę chciał coś sprawdzać przed dodaniem każdego rekordu.

Ad 2. Tak MySQL. Niestety jakbym mógł coś szybszego użyć to bym tego użył.

Ad 3. Nie mogę niestety niczego doinstalować do php na tym hostingu.

Ad 4, 5. Jak zacznie to co robię przynosić jakiekolwiek zyski, to zainwestuje w chmurę, no ale do tego czasu trzeba brać to co dają.


Rozwiązałem ten problem w następujący sposób:
Skrypt dodaje po kilka tysięcy rekordów, zapisuje numer ostatniego dodanego rekordu do bazy danych. Następnie kończy działanie, jednocześnie uruchamiając się ponownie (zaczynając w miejscu, w którym ostatnio skończył). I tak w kółko, dopóki nie dojdzie do końca pliku.

Oprócz tego zrezygnowałem z encji, na rzecz własnych zapytań. Dzięki temu mogę jeszcze zaoszczędzić trochę czasu, wyłączając na czas dodawania rekordów sprawdzanie kluczy.


Walczyłem kiedyś z podobnym problemem i ciekawi mnie w jaki sposób wywołujesz ponownie skrypt "Następnie kończy działanie, jednocześnie uruchamiając się ponownie" jeśli pod koniec wykonania skryptu w jego ciele uruchomisz go ponownie to ten "stary" skrypt będzie czekał na zakończenie swojej nowej "kopi" i lipa... jeśli zakończysz skrypt to aby uruchomić dodanie kolejnej porcji danych musisz go uruchomić w jakiś sposób z zewnątrz, cron, ajax itp....

pzdr.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:55