Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z załadowaniem dużej ilości danych do pamięci
Forum PHP.pl > Forum > Przedszkole
szufl4d
  1. <?php
  2. require_once 'Excel/reader.php';
  3. $xls = new Spreadsheet_Excel_Reader();
  4. $xls->setOutputEncoding('cp1250');
  5. $xls->read('test6.xls');
  6.  
  7.  
  8. for ($i = 1; $i <= $xls->sheets[0]['numRows']; $i++) {
  9. echo $i;
  10. for ($j = 1; $j <= $xls->sheets[0]['numCols']; $j++) {
  11. echo $xls->sheets[0]['cells'][$i][$j] . ' ';
  12. }
  13. echo '<br />';
  14. }
  15.  
  16. ?>


Powyższy kod to fragment do odczytu pliku z excel. Niestety mój problem polega na tym, że plik test6.xls ma 65 k rekordów. Przy próbie odczytania 20k wszystko działa, jednak przy próbie odczytania całości otrzymuję poniższy błąd.

Fatal Error: Allowed Memory Size of 134217728 Bytes Exhauste

Czy ktoś może mi poradzić jak mogę to rozwiązać? Dodam, że odczytanie tego pliku to połowa sukcesu, ponieważ wszystkie rekordy muszę jeszcze zapisać do bazy danych. W zasadzie tak wygląda cały case xls -> MySQL być może ktoś zna prostszy sposób? Będę dozgonnie wdzięczny za pomoc.

P.S. Jestem początkującym "pisarzem" więc proszę o wyrozumiałość.
phpion
Jeśli możliwe jest wgrywanie danych z pliku csv to wówczas zrobisz to dużo szybciej (np. przez LOAD DATA), a przy tym problem pamięci przestanie istnieć.
szufl4d
LOAD DATA? Możesz rozwinąć temat? Domniemam tylko, że może chodzić o import csv do mysql np przez phpmyadmin. Niestety próbowałem w ten sposób, ale są dwa problemy. Przy tak dużym pliku też się wysypuje i drugi sam export do pliku *csv. Ponieważ standardowy zapis poniższy błąd, a skrypt VBA (Który znalazłem w internecie, tylko częściowo prawidłowo dodaje rekordy, część jest pomieszana).




Dodam, że troszkę rzuciłem się na głęboką wodę i skrypt uruchamiam na moim VPS. Próbowałem zwiększyć limit pamięci poprzez dodanie ini_set('memory_limit', '256M'); do php.ini, niestety nic nie zmieniło.

Zastanawiam się czy da się to obsłużyć w jakiś skolejkowany sposób? np odczyt 1 k rekordów, zapis do bazy od razu, a następnie odczyt kolejnego 1k itd aż do końca arkusza? Próbowałem ograniczyć liczbę przebiegów pętli, ale i tak chyba wszystko jest ładowane do pamięci, ponieważ również otrzymuje błąd...
  1. for ($i = 1; $i <= 100; $i++) {
  2. echo $i;
  3. for ($j = 1; $j <= $xls->sheets[0]['numCols']; $j++) {
  4. echo $xls->sheets[0]['cells'][$i][$j] . ' ';
  5. }
  6. echo '<br />';
  7. }
  8.  
  9.  
phpion
Cytat(szufl4d @ 1.03.2016, 10:56:38 ) *
LOAD DATA? Możesz rozwinąć temat?

http://dev.mysql.com/doc/refman/5.7/en/load-data.html
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.