2012-04-22 41 views
9

在一個CSV文件中讀取我從Kaggle抓起KDD TRACK1數據集,並決定加載〜2.5GB 3列CSV文件到內存中,在我的16GB大內存的EC2實例:大內存的問題使用numpy的

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

python會話吃了我所有的記憶(100%),然後被殺死。

然後我使用R(通過read.table)讀取相同的文件,並使用少於5GB的RAM,在我調用垃圾回收器後崩潰到小於2GB。

我的問題是爲什麼在numpy下失敗,以及將文件讀入內存的正確方法是什麼。是的,我可以使用生成器並避免該問題,但這不是目標。

+0

相關http://stackoverflow.com/questions/8956832/python-out-of-memory-on-large-csv-file-numpy – Anycorn 2012-04-22 03:02:53

+0

如果單精度會做,'np.fromfile/np.loadtxt(D型= np.float32)'會佔用更少的內存,然後'X = X.astype(np.float64)'完成。 – denis 2013-07-30 14:53:03

回答

6
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) 

這將讀取2.5GB文件,串行輸出矩陣。輸入文件是「懶惰地」讀取的,因此不會構建中間數據結構並使用最少的內存。初始加載需要很長時間,但每個後續加載(序列化文件)都很快。請讓我,如果你有提示!

+1

如果您先前指定了列的數量,爲什麼不做更像這樣的事情:https://gist.github.com/2465280?在附註中,要從發生器創建數組,請使用'np.fromiter'。 – 2012-04-22 16:56:44

+0

已更新!非常感謝! – vgoklani 2012-04-22 17:25:37