¿Por qué la lectura de archivos de Npypy Narray consume tanta memoria?

el archivo contiene 2000000 filas: cada fila contiene 208 columnas, separadas por comas, así:

  0.0863314058048,0.0208767447842,0.03358010485,0.0,1.0,0.0,0.314285714286,0.336293217457,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0 

El progtwig leyó este archivo en una memoria numpy, esperaba que consumiera aproximadamente (2000000 * 208 * 8B) = 3.2GB memoria. Sin embargo, cuando el progtwig leyó este archivo, encontré que el progtwig consume aproximadamente 20 GB de memoria.

¿Estoy confundido acerca de por qué mi progtwig consume tanta memoria que no cumple con las expectativas?

Estoy usando Numpy 1.9.0 y la insuficiencia de memoria de np.loadtxt() y np.genfromtxt() parece estar directamente relacionada con el hecho de que se basan en listas temporales para almacenar los datos:

  • ver aquí para np.loadtxt()
  • y aquí para np.genfromtxt()

Al conocer de antemano la shape de su matriz, puede pensar en un lector de archivos que consumirá una cantidad de memoria muy cercana a la cantidad teórica de memoria (3,2 GB para este caso), almacenando los datos utilizando el tipo de dtype correspondiente:

 def read_large_txt(path, delimiter=None, dtype=None): with open(path) as f: nrows = sum(1 for line in f) f.seek(0) ncols = len(f.next().split(delimiter)) out = np.empty((nrows, ncols), dtype=dtype) f.seek(0) for i, line in enumerate(f): out[i] = line.split(delimiter) return out 

Creo que deberías probar pandas para manejar big data (archivos de texto). Los pandas son como un excel en python. Y utiliza internamente numpy para representar los datos.

Los archivos HDF5 también son otro método para guardar big data en un archivo binario hdf5.

Esta pregunta le daría una idea de cómo manejar archivos grandes: flujos de trabajo de “datos grandes” usando pandas