2011-02-08 17 views
5

Mam następujący kod:pamięci wyczerpany błędu json_parse PHP

<?php 
$FILE="giant-data-barf.txt"; 

$fp = fopen($FILE,'r'); 

//read everything into data 
$data = fread($fp, filesize($FILE)); 
fclose($fp); 

$data_arr = json_decode($data); 
var_dump($data_arr); 
?> 

Plik gigant-data-barf.txt jest, jak sama nazwa wskazuje, to ogromny plik (to 5,4MB teraz, ale może pójść do kilku GB)

Kiedy wykonać ten skrypt, pojawia się następujący błąd:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in ........./data.php on line 12 

Spojrzałem na możliwych rozwiązań, i zobaczyłem to:

ini_set('memory_limit','16M'); 

i moje pytanie brzmi, czy istnieje ograniczenie, jak dużą mam ustawić pamięć? Czy istnieje lepszy sposób na rozwiązanie tego problemu?

+1

To może nie być zadanie PHP doskonale nadaje się do. Czy możesz korzystać z narzędzi wiersza poleceń? –

+2

płaskie przechowywanie pliku o takim rozmiarze spowoduje wiele problemów. Użyj sqlite lub mysql. jeśli plik zawiera tylko jedną zmienną, która została zakodowana przez json i jest tak wielka, jest mało prawdopodobne, że będziesz w stanie rozwiązać ten problem. json nie jest przeznaczony dla tak dużych plików. Użyj bazy danych lub przechowuj ją w CSV lub przechowuj każdy wiersz w jsonie zamiast całej rzeczy. – Jason

+0

Jedynym problemem jest to, że ktoś eksportuje mi całą bazę danych w formacie JSON ... –

Odpowiedz

8

To bardzo zły pomysł, powiedział, że trzeba ustawić

ini_set('memory_limit',filesize($FILE) + SOME_OVERHEAD_AMOUNT); 

ponieważ czytasz całą rzecz w pamięci. Można bardzo dobrze trzeba ustawić limit pamięci do dwa krotnej wielkości pliku ponieważ również chcą JSON_DECODE

pamiętać, że w sieci web server pochłonie ogromne ilości pamięci i nie należy ZROBIĆ TO, JEŚLI PLIK BĘDZIE WIELE GIGABYTÓW, JAK POWIEDZIAŁEŚ !!!!

Czy to naprawdę gigantyczny blob JSON? Powinieneś popatrzeć na konwersję tego do bazy danych lub innego formatu, w którym możesz użyć dostępu losowego lub wierszowego przy pomocy , zanim parsujesz z PHP.

2

Podałem wszystkie moje serwery memory_limit z 100M ... jeszcze nie wpadłem w kłopoty.

uważam dzielenie się ten plik jakoś, albo pozbyć się go i używać bazy danych

+0

Czy istnieje sposób na importowanie pliku JSON do bazy danych? –

+1

@TonyStark za pomocą niestandardowej aplikacji napisanej po przejściu, aby pobrać ten plik i przekonwertować go na coś, co MySQL rozumie, na pewno. Aby to zrobić za pomocą obecnych narzędzi? Wątpię. Istnieją lepsze sposoby rozwiązania tego problemu. – jcolebrand

+0

dunnow ... nigdy wcześniej tego nie robiłem:/ –

Powiązane problemy