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.

La forma más eficiente de convertir archivos grandes .txt (tamaño >30GB) en archivos .csv después del preprocesamiento utilizando Python.

Tengo datos en un archivo .txt que se ve así (llamémoslo “myfile.txt”):

28807644’~’0’~’Maun FCU’~’US#@#@#28855353’~’0’~’WNB Holdings LLC’~’US#@#@#29212330’~’0’~’Idaho First Bank’~’US#@#@#29278777’~’0’~’Republic Bank of Arizona’~’US#@#@#29633181’~’0’~’Friendly Hills Bank’~’US#@#@#29760145’~’0’~’The Freedom Bank of Virginia’~’US#@#@#100504846’~’0’~’Community First Fund Federal Credit Union’~’US#@#@#

He intentado un par de maneras de convertir este .txt en un .csv, una de ellas fue usando la biblioteca CSV, pero ya que me gustan mucho los pandas, utilicé lo siguiente:

import pandas as pd
import time

se anota el tiempo al inicio del programa

start = time.time()

Establecemos la ruta donde se encuentra nuestro archivo y lo leemos

path = r’myfile.txt’
f = open(path, ‘r’)
content = f.read()

Reemplazamos las cadenas no deseadas e introducimos un salto de línea.

content_filtered = content.replace(“#@#@#”, “\n”).replace(“‘”, “”)

Leemos todo en columnas con el separador “~”

df = pd.DataFrame([x.split(‘~’) for x in content_filtered.split(‘\n’)], columns = [‘a’, ‘b’, ‘c’, ‘d’])

Imprimimos el dataframe en un csv

df.to_csv(path.replace(‘.txt’, ‘.csv’), index = None)
end = time.time()

tiempo total tomado para imprimir el archivo

print(“Tiempo de ejecución en segundos:”, (end – start))

Esto tarda unos 35 segundos en procesarse, es un archivo de 300MB, puedo aceptar ese tipo de rendimiento, pero estoy tratando de hacer lo mismo para un archivo mucho más grande de un tamaño de 35GB y esto produce un mensaje de error de memoria.

Intenté usar la biblioteca CSV, pero los resultados fueron similares, intenté poner todo en una lista y luego escribirlo en un CSV:

import csv

Escribimos en CSV

with open(path.replace(‘.txt’, ‘.csv’), “w”) as outfile:
write = csv.writer(outfile)
write.writerows(split_content)

Los resultados fueron similares, no hubo una gran mejora. ¿Hay alguna forma o metodología que pueda usar para convertir archivos .txt MUY grandes en .csv? ¿Probablemente por encima de los 35GB?

Estaría encantado de leer cualquier sugerencia que puedas tener, ¡gracias de antemano!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Conversión de archivos de texto grandes a CSV

    Si está trabajando con archivos de texto muy grandes (por ejemplo, de más de 35GB), la conversión a CSV puede ser una tarea desalentadora. Sin embargo, existen algunas técnicas que puede utilizar para hacer que el proceso sea más eficiente.

    Un enfoque consiste en procesar el archivo de texto en fragmentos. En lugar de leer todo el archivo en memoria, puede leerlo línea por línea y escribir el archivo de CSV en lotes. De esta manera, puede limitar la cantidad de datos que deben almacenarse en memoria en cualquier momento dado.

    Aquí hay un ejemplo de fragmento de código que muestra cómo convertir un archivo de texto grande a CSV en fragmentos:

    import csv
    
    # Abrir archivos de entrada y salida
    archivo_entrada = open('archivo_grande.txt', 'r')
    archivo_salida = open('archivo_salida.csv', 'w')
    
    # Configurar el escritor de CSV
    escritor_csv = csv.writer(archivo_salida)
    
    # Leer y escribir el archivo en fragmentos
    while True:
        # Leer un fragmento de líneas
        lineas = archivo_entrada.readlines(100000)
    
        # Si no hay más líneas, salir del bucle
        if not lineas:
            break
    
        # Procesar las líneas y escribir en CSV
        for linea in lineas:
            # Dividir la línea en columnas según el separador
            columnas = linea.split(',')
    
            # Escribir la fila en CSV
            escritor_csv.writerow(columnas)
    
    # Cerrar archivos
    archivo_entrada.close()
    archivo_salida.close()
    

    En este ejemplo, utilizamos readlines() para leer el archivo en fragmentos de 100.000 líneas. Puede ajustar este valor en función de la cantidad de memoria que tiene disponible y el tamaño de cada línea. Luego procesamos cada línea utilizando split() para dividirla en columnas según el separador (en este caso, una coma) y la escribimos en el archivo CSV utilizando writerow(). Finalmente, cerramos los archivos de entrada y salida.

    Al procesar el archivo en fragmentos, podemos reducir la cantidad de memoria necesaria para realizar la conversión y evitar problemas de MemoryError. También puede experimentar con diferentes tamaños de fragmentos para encontrar el valor óptimo para su situación.

    Otro enfoque es utilizar un marco de trabajo de cómputo distribuido como Apache Spark para realizar la conversión en paralelo en varios nodos. Esto puede ser más complejo de configurar, pero puede proporcionar una aceleración significativa para archivos muy grandes.

    Independientemente del enfoque que elija, es importante monitorear el uso de la memoria y el progreso de la conversión para asegurarse de que se esté ejecutando sin problemas y no cause problemas para otros procesos en su sistema.

Comments are closed.