我从Kaggle抓起KDD TRACK1数据集,并决定加载〜2.5GB 3列CSV文件到内存中,在我的16GB大内存的EC2实例:
data = np.loadtxt('rec_log_train.txt')
蟒蛇吃了会了我所有的记忆(100%),然后被杀害。
然后I(经由函数read.table)读取使用R中的同一文件,它比RAM的5GB,其折叠到小于2GB后我称为垃圾收集器中使用更小。
我的问题是,为什么这下numpy的失败,什么是读取文件到内存中的正确方法。 是的,我可以用发电机和避免的问题,但这不是目标。
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文件,串行输出矩阵。 输入文件被读入“懒惰”,所以没有中间数据结构是建立和最小的存储器被使用。 初始加载需要较长的时间,但(序列化的文件的)每个随后的负载是快的。 请让我,如果你有技巧!
试用recfile现在: http://code.google.com/p/recfile/ 。 有一对夫妇的努力,我知道做一个快速的C / C ++的NumPy的文件阅读器; 这对熊猫我短暂的待办事项列表,因为它会导致这样的问题。 沃伦Weckesser也有这里的项目: https://github.com/WarrenWeckesser/textreader 。 我不知道哪一个是更好的,都去尝试一下?
您可以尝试numpy.fromfile
http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html