使用numpy读取csv文件中的主要内存问题

时间:2012-04-22 02:35:07

标签: python r pandas numpy kaggle

我从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下失败,以及将文件读入内存的正确方法是什么。是的我可以使用发电机并避免问题,但这不是目标。

3 个答案:

答案 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)