Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przetwarzanie duże ilości danych
Forum PHP.pl > Forum > PHP
phuria
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()).
Pyton_000
pokaż zapytania, pokaż strukturę bazy
phuria
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
Pyton_000
Widzę, czytać umiem smile.gif
Pokaż jak generujesz wsady
cepa
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.
phuria
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.
Pyton_000
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
phpmack
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.