Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: insert dużej ilości danych
Forum PHP.pl > Forum > Bazy danych
olo707
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
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
dzięki
phpion
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
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
Większość baz danych umożliwi Ci bezpośredni import danych z pliku CSV. Postgres: http://www.postgresql.org/docs/9.5/static/sql-copy.html MySQL: http://dev.mysql.com/doc/refman/5.7/en/load-data.html
phpion
@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
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
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.