Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> insert dużej ilości danych
olo707
post
Post #1





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 30.03.2012

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


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ć.

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Pyton_000
post
Post #2





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

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


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)
Go to the top of the page
+Quote Post
olo707
post
Post #3





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 30.03.2012

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


dzięki
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
olo707
post
Post #5





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 30.03.2012

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


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
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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
Go to the top of the page
+Quote Post
phpion
post
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@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.
Go to the top of the page
+Quote Post
athabus
post
Post #8





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
maly_swd
post
Post #9





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


Można jeszcze wstawiać to w transakcji, wtedy po każdym insercie nie ma comita.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.12.2025 - 13:24