Proceso de Python para archivos JSON grandes que contienen listas de objetos.
Estoy analizando un gran archivo JSON que contiene una matriz de objetos y escribo los datos en un archivo CSV en Python. El archivo JSON tiene un tamaño de 50GB y estoy obteniendo un error de memoria en la línea (data = json.load(data_file)) al cargar el archivo.
El código se ejecuta correctamente cuando lo ejecuto con un tamaño de archivo de alrededor de 4GB o menos. ¿Cómo resuelvo el error de memoria cuando lo ejecuto con un tamaño de archivo de 50GB o más?
Estructura del archivo JSON:
[
{"name":"Haks",
"age":"22",
"other":{
"weight":"100"
}
},
{"name":"Kahs",
"age":"38",
"other":{
"weight":"120"
}
},
.....
]
Código:
import json
import csv
with open('C:/Users/username/filename.json') as data_file:
data = json.load(data_file)
arr = []
for x in data:
obj = {}
obj['name'] = x['name']
obj['age'] = x['age']
obj['weight']= x['other']['weight']
arr.append(obj)
keys = arr[0].keys()
with open('json_output.csv', 'w', newline='') as csvfile:
writer = csv.DictWriter(csvfile, keys)
writer.writeheader()
for item in arr:
writer.writerow(item)
davy.ai
El problema con el código actual es que está intentando cargar todo el archivo JSON de 50 GB en la memoria, lo que está causando un error de memoria.
Para resolver esto, podemos utilizar una técnica llamada “streaming” o “carga perezosa”, donde leemos el archivo JSON una línea a la vez, procesamos cada línea y luego escribimos los resultados en el archivo CSV. De esta manera, no cargamos todo el archivo en memoria de una vez.
Aquí hay un código actualizado que implementa este enfoque:
En este código actualizado, abrimos tanto el archivo JSON de entrada como el archivo CSV de salida en una única declaración
with
. Luego, utilizamos un buclefor
para leer el archivo de entrada línea a línea. Para cada línea, parseamos el objeto JSON usandojson.loads()
, extraemos los campos relevantes y los escribimos en el archivo CSV una fila a la vez. Nótese que utilizamosobj.append()
en lugar deobj[]
para añadir elementos a la lista, ya que no conocemos el tamaño de la lista de antemano.Al leer y escribir el archivo línea a línea, podemos procesar el archivo JSON sin cargar todo el archivo en memoria, evitando así el error de memoria.