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.

Convertir un archivo de texto de una sola columna con 300 millones de filas en un arreglo NumPy más rápido.

Tengo un archivo txt que contiene más de 300 millones de filas con 1 columna. Estoy tratando de leerlo y convertirlo en un arreglo de numpy. Actualmente he intentado:

label = np.loadtxt('/ruta/al/archivo')

y

for lines in fileinput.input('/ruta/al/archivo'):
    hacer_algo_con(lines)

Parece que np.loadtxt tiene un rendimiento ligeramente más rápido, pero aún necesita horas para leer un solo archivo txt. El archivo tiene más de 300 millones de filas con 1 columna, pero su tamaño es de sólo alrededor de 950 MB. Sospecho que np.loadtxt también está leyendo el archivo línea por línea, lo que hace que el tiempo de procesamiento sea largo.

Me pregunto si hay algún método que pueda acelerar este proceso de lectura y conversión mientras se mantiene la secuencia de las filas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Dado que el archivo tiene solo una columna, usar np.loadtxt puede no ser el enfoque más adecuado ya que está diseñado principalmente para archivos con una estructura específica (por ejemplo, columnas delimitadas). Uno de los enfoques posibles es usar la función np.fromfile, que permite leer datos binarios directamente desde un archivo en un arreglo numpy. A continuación se muestra un ejemplo de código:

    import numpy as np
    
    filename = '/ruta/al/archivo'
    dtype = np.float32  # o el tipo de dato necesario
    
    # Determinar el número de filas y crear un arreglo numpy vacío
    with open(filename, 'rb') as f:
        num_rows = sum(1 for _ in f)
    data = np.empty(num_rows, dtype=dtype)
    
    # Leer los datos en el arreglo numpy
    with open(filename, 'rb') as f:
        data = np.fromfile(f, dtype=dtype)
    
    # Darle forma al arreglo para tener una sola columna
    data = np.reshape(data, (-1, 1))
    

    El código primero determina el número de filas en el archivo contando el número de líneas usando sum. Luego crea un arreglo numpy vacío con el tipo de dato y forma correctos. Finalmente, lee los datos del archivo en el arreglo numpy usando np.fromfile y da forma al arreglo para tener una sola columna.

    Es importante tener en cuenta que este enfoque puede no ser necesariamente más rápido que np.loadtxt, especialmente si el cuello de botella es la E/S del disco. Sin embargo, evita la sobrecarga de analizar datos de texto y puede ser más eficiente para archivos binarios grandes. Además, para mejorar aún más el rendimiento, es posible considerar el uso de archivos mapeados en memoria o procesamiento paralelo.

Comments are closed.