2011-02-08 9 views
5

tengo el siguiente código:memoria de errores con succión para 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); 
?> 

El archivo gigante-data-barf.txt es, como su nombre indica, un archivo enorme (es 5.4MB en este momento, pero que podría ir hasta varios GB)

Cuando ejecuto este guión, me sale el siguiente error:

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

miré a posibles soluciones, y vi esto:

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

y mi pregunta es, ¿hay un límite en lo grande que debo configurar mi memoria? ¿O hay una mejor manera de resolver este problema?

+1

Esto puede no ser un trabajo PHP es perfectamente adecuado para. ¿Puedes usar herramientas de línea de comando? –

+2

almacenamiento de archivos planos de un archivo de ese tamaño va a causar muchos problemas. Use sqlite o mysql. si el archivo contiene solo una variable que ha sido codificada json y es tan grande, es poco probable que puedas resolver esto. json no está diseñado para archivos tan grandes. Usar una base de datos, o almacenarla en CSV, o almacenar cada fila en json en lugar de todo – Jason

+0

El único problema es que alguien me está exportando la base de datos completa en formato JSON ... –

Respuesta

8

Esta es una idea muy mala, que ha enunciado, se tendrá que establecer

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

porque estás leyendo todo en la memoria. Es muy posible que tenga que configurar el límite de memoria a dos veces el tamaño del archivo, ya que también desea JSON_DECODE

en cuenta que en un servidor web Esto consume grandes cantidades de memoria y no deben HAGA ESTO SI EL ARCHIVO SERÁ MUCHOS GIGABYTES COMO DIJO !!!!

¿Es realmente un gigante JSON blob? Debería considerar convertir esto a una base de datos u otro formato que pueda usar acceso aleatorio o en fila con antes de analizar con PHP.

2

He dado todos mis servidores a memory_limit de 100M ... no he tenido problemas todavía.

yo consideraría dividir el archivo de alguna manera, o deshacerse de él y utilizar una base de datos

+0

¿hay alguna manera de importar un archivo JSON en un DB? –

+1

@TonyStark utilizando una aplicación escrita personalizada para tomar ese archivo y convertirlo en algo que MySQL entiende, claro. Para hacerlo usando las herramientas actuales? Lo dudo. Hay mejores formas de resolver este problema. – jcolebrand

+0

dunnow ... nunca lo hizo antes:/ –