2011-02-08 2 views
5

ho il seguente codice:memoria per json_parse con 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); 
?> 

Il file gigante-dati-barf.txt è, come suggerisce il nome, un file enorme (è 5.4MB in questo momento, ma potrebbe andare fino a diversi GB)

Quando eseguo questo script, ottengo il seguente errore:

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

ho guardato le possibili soluzioni, e ho visto questo:

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

e la mia domanda è, c'è un limite a quanto grande dovrei impostare la mia memoria? O c'è un modo migliore per risolvere questo problema?

+1

Questo potrebbe non essere un lavoro per cui PHP è perfettamente adatto. Puoi usare gli strumenti da riga di comando? –

+2

Archiviazione file flat di un file di quelle dimensioni causerà molti problemi. Usa sqlite o mysql. se il file contiene solo una variabile che è stata codificata con json ed è così enorme, è improbabile che tu possa risolverlo. json non è pensato per file così grandi. Utilizzare un database, o memorizzarlo in CSV, o memorizzare ogni riga in json invece dell'intera cosa – Jason

+0

L'unico problema è che qualcuno mi sta esportando l'intero DB in formato JSON ... –

risposta

8

questa è un'idea MOLTO MALE, che ha detto, è necessario impostare

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

perché stai leggendo l'intera cosa in memoria. Si può benissimo avere per impostare il limite di memoria per due volte la dimensione del file da quando anche desidera JSON_DECODE

Si noti che su un server Web QUESTO consumerà enormi quantità di memoria e non si deve FARE QUESTO SE IL FILE SARÀ MOLTI GIGABYTES COME HAI DETTO !!!!

È davvero un gigante blob JSON? Dovresti cercare di convertirlo in un database o in un altro formato che puoi utilizzare con accesso casuale o di riga con prima dell'analisi con PHP.

2

Ho dato a tutti i miei server uno memory_limit di 100M ... non ha ancora avuto problemi.

vorrei prendere in considerazione suddividere il file in qualche modo, o sbarazzarsi di esso e utilizzare un database

+0

c'è un modo per importare un file JSON in un DB? –

+1

@TonyStark utilizza un'app personalizzata per scrivere su quel file e convertirlo in qualcosa che MySQL comprende, certo. Per farlo usando gli strumenti attuali? Ne dubito. Ci sono modi migliori per risolvere questo problema. – jcolebrand

+0

dunnow ... mai fatto prima:/ –