![]() |
![]() |
![]()
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()). |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
pokaż zapytania, pokaż strukturę bazy
|
|
|
![]()
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
![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Widzę, czytać umiem
![]() Pokaż jak generujesz wsady |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 125 Pomógł: 7 Dołączył: 27.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
1) Doctrine!? Albo wydajnie albo doctrine
![]() 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. -------------------- |
|
|
![]()
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 |
|
|
![]()
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 ![]() Możesz jeszcze opóźnić regenerowanie indeksów |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 55 Pomógł: 1 Dołączył: 11.06.2011 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. 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. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 09:55 |