我从Kaggle获取了KDD track1数据集,并决定在我的16GB高内存EC2实例上加载一个~2.5GB的3列CSV文件到内存中:
data = np.loadtxt('rec_log_train.txt')
python会话吃掉了我所有的记忆(100%),然后被杀了。
然后我使用R(通过read.table)读取相同的文件,并且它使用了不到5GB的ram,在我调用垃圾收集器后崩溃到小于2GB。
我的问题是为什么这会在numpy下失败,以及将文件读入内存的正确方法是什么。是的我可以使用发电机并避免问题,但这不是目标。
答案 0 :(得分: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 :(得分:2)
立即试用recfile:http://code.google.com/p/recfile/。我知道有几项努力为NumPy制作一个快速的C / C ++文件阅读器;它出现在我的pandas短小清单上,因为它会导致像这样的问题。 Warren Weckesser也有一个项目:https://github.com/WarrenWeckesser/textreader。我不知道哪一个更好,试试两个?
答案 2 :(得分:1)
您可以尝试numpy.fromfile
http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html