Leer ficheros JSON enormes en PHP

Leer ficheros grandes siempre suele traer problemas, pero normalmente se puede solventar leyendo fila a fila. Pero... ¿y los JSON?

Leer ficheros JSON enormes en PHP
Photo by Pankaj Patel / Unsplash

Tras el post sobre leer ficheros CSV enormes en PHP, llega mi nueva aventura pero esta vez en formato JSON.

Tenía un problema, y ese problema era un JSON de más de 1GB que no era capaz de leer desde PHP. La forma típica de leer un JSON siempre ha sido esta:

$rawData = file_get_contents('./big_json.json');
$data = json_decode($rawData);

Sin embargo, cuando $rawData es tan grande que no te cabe en memoria, ¿qué haces? Hasta donde yo sé, no es posible con estas funciones de PHP leer un JSON por líneas como podrías hacer con un CSV, por lo que es un problema bastante más complicado.

En mi caso, solucioné el problema usando JSON Machine, que nos permite streamear la lectura de ficheros JSON muy grandes de forma muy sencilla. En mi caso, mi fichero tenía una estructura así:

{
	"result": {
    	"rows": [...]
    }
}

Y dentro de "rows" podría haber cientos de miles de objetos. Para leerlo con JsonMachine es tan simple como esto:

use JsonMachine\Items;

$items = Items::fromFile($fileName, ['pointer' => '/result/rows']);
foreach ($items as $item) {
	$item = (array) $item;
	// do something
}

Gracias al parámetro pointer, puedo decirle a JSON Machine qué path del JSON es el que me interesa, y me va a permitir recorrer cada elemento de result.rows, de uno en uno y de forma eficiente en cuanto al uso de memoria. Desde aquí las mil gracias a los creadores de este proyecto 🫡💛