Problemas de memoria importantes al leer en un archivo csv usando numpy

Tomé el conjunto de datos de KDD track1 de Kaggle y decidí cargar un archivo CSV de 3 columnas de ~ 2.5GB en la memoria, en mi instancia de EC2 de 16 GB de memoria alta:

data = np.loadtxt('rec_log_train.txt') 

La sesión de python se comió toda mi memoria (100%) y luego fue asesinada.

Luego leí el mismo archivo usando R (a través de la tabla de lectura) y usé menos de 5 GB de RAM, que se colapsó a menos de 2 GB después de que llamé al recolector de basura.

Mi pregunta es por qué falló esto bajo el número y cuál es la forma correcta de leer un archivo en la memoria. Sí, puedo usar generadores y evitar el problema, pero ese no es el objective.

 import pandas, re, numpy as np def load_file(filename, num_cols, delimiter='\t'): data = None try: data = np.load(filename + '.npy') except: splitter = re.compile(delimiter) def items(infile): for line in infile: for item in splitter.split(line): yield item with open(filename, 'r') as infile: data = np.fromiter(items(infile), float64, -1) data = data.reshape((-1, num_cols)) np.save(filename, data) return pandas.DataFrame(data) 

Esto se lee en el archivo de 2.5GB y serializa la matriz de salida. El archivo de entrada se lee “perezosamente”, por lo que no se crean estructuras de datos intermedias y se utiliza una memoria mínima. La carga inicial lleva mucho tiempo, pero cada carga subsiguiente (del archivo serializado) es rápida. Por favor, déjame si tienes consejos!

Pruebe el archivo de recuperación por ahora: http://code.google.com/p/recfile/ . Hay algunos esfuerzos que conozco para crear un lector de archivos C / C ++ rápido para NumPy; está en mi corta lista de tareas para pandas porque causa problemas como estos. Warren Weckesser también tiene un proyecto aquí: https://github.com/WarrenWeckesser/textreader . No sé cuál es mejor, pruébalos ambos?