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!
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:
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 utilizandosplit()
para dividirla en columnas según el separador (en este caso, una coma) y la escribimos en el archivo CSV utilizandowriterow()
. 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.