olo707
17.02.2016, 14:04:55
Witam
Mam takie zadanie do zrobienia. Z plików CSV muszę pobrać odpowiednie dane (nie chodzi mi o import całej zawartości pliku do bazy danych używając phpmyadmina (to akurat wiem jak zrobić)) i dodać je do bazy danych z poziomu kodu. Pobieram dane wykorzystując funkcje php-a operujące na ciągach tekstowych i dodaje wartości do tablicy. Następnie wartości z tablicy zapisuje do bazy danych (używam PDO). Przykładowa jedna wartość takich danych wygląda tak : 5090,40.45,2015-06-06. Wszystko działa idealnie ale do momentu jeśli takich wartości jest do ok 1500. Jeśli tych wartości jest np 16000 to już nie jest w stanie zapisać tych danych do bazy danych. Pojawia się napis Fatal error: Maximum execution time of 60 seconds exceeded in ...
Czy da się to w ogóle w ten sposób zrobić ? A jeśli nie to będę wdzięczny za jakąś wskazówkę jak to wykonać.
Pyton_000
17.02.2016, 14:18:07
Zapewne robisz inserty pojedynczo.
Spróbuj:
- albo objąć całość operacji w transakcję
- zbudować multi insert (http://stackoverflow.com/questions/1176352/pdo-prepared-inserts-multiple-rows-in-single-query)
olo707
17.02.2016, 14:58:01
dzięki
phpion
22.02.2016, 12:28:45
1. LOAD DATA do tabeli tymczasowej.
2. Przekształcasz dane w tabeli tymczasowej, usuwasz zbędne rekordy.
3. Przenosisz dane z tabeli tymczasowej do właściwej poleceniem INSERT INTO ... SELECT ...
Na pewno będzie to dużo szybsze, a i problem pamięci zniknie.
olo707
25.02.2016, 14:39:26
chodzi o import danych z plików csv, czy błędem byłoby importowanie danych z tych plików bezpośrednio do tabeli właściwej (nie tymczasowej), działa to nieźle
Crozin
25.02.2016, 14:53:00
phpion
25.02.2016, 15:20:45
@olo707:
Nie, nie ma w tym nic złego. W zasadzie w ten sposób przyspieszasz cały proces. Jednak wszystko zależy od tego jaki plik CSV importujesz. Przykładowo: w tabeli, do której wstawiasz dane, są jakieś klucze obce które wgrywasz z pliku to wypadałoby sprawdzić integralność danych. Dalej: przekształcenia danych. U nas w CSV liczby wgrywane są w różnych formatach np. 1234.56 lub 1 234,56. Jeśli wrzucisz tą drugą wartość to pola numerycznego to otrzymasz głupoty. Robimy to tak, że domyślnie każda wartość ląduje w polu tekstowym, następnie dane są modyfikowane (np. spacja zamieniana na nic, przecinek na kropkę) i zmieniamy typ pola na numeryczny. Dopiero tak przygotowana wartość leci do tabeli właściwej.
athabus
25.02.2016, 16:00:25
Ewentualnie jesli to jednorazowy import to po prostu zwieksz limit czasu wykonania skryptu w php.ini
W przypadku insertow najlepiej zrobic 1 zapytanie z duza iloscis rekordow. Wtedy 15.000 to zadna ilosc. Jak kazdy rekord wstawiasz osobno to juz moze byc klopot.
maly_swd
25.02.2016, 16:40:38
Można jeszcze wstawiać to w transakcji, wtedy po każdym insercie nie ma comita.
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.