es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , , , ,

Answer

  1. Avatar for 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:

    import json 
    import csv
    
    with open('C:/Users/username/filename.json') as data_file, open('json_output.csv', 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['nombre', 'edad', 'peso']) # escribir fila de encabezado
    
        for line in data_file:
            data = json.loads(line)
            obj = []
            obj.append(data['nombre'])
            obj.append(data['edad'])
            obj.append(data['otro']['peso'])
            writer.writerow(obj)
    

    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 bucle for para leer el archivo de entrada línea a línea. Para cada línea, parseamos el objeto JSON usando json.loads(), extraemos los campos relevantes y los escribimos en el archivo CSV una fila a la vez. Nótese que utilizamos obj.append() en lugar de obj[] 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.

Comments are closed.