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ć. |
|
|
|
![]() |
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) |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 77 Pomógł: 0 Dołączył: 30.03.2012 Ostrzeżenie: (0%)
|
dzięki
|
|
|
|
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. |
|
|
|
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
|
|
|
|
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
|
|
|
|
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. |
|
|
|
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. |
|
|
|
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.
|
|
|
|
![]() ![]() |
|
Aktualny czas: 22.12.2025 - 20:31 |