9

我从 Kaggle 获取了 KDD track1 数据集,并决定在我的 16GB 高内存 EC2 实例上将一个约 2.5GB 的 3 列 CSV 文件加载到内存中:

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

python 会话占用了我所有的内存(100%),然后被杀死了。

然后我使用 R(通过 read.table)读取了同一个文件,它使用了不到 5GB 的内存,在我调用垃圾收集器后它崩溃到不到 2GB。

我的问题是为什么这会在 numpy 下失败,以及将文件读入内存的正确方法是什么。是的,我可以使用生成器来避免问题,但这不是目标。

4

3 回答 3

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 文件,并序列化输出矩阵。输入文件是“懒惰地”读取的,因此不会构建中间数据结构并且使用最少的内存。初始加载需要很长时间,但每次后续加载(序列化文件)都很快。如果您有提示,请告诉我!

于 2012-04-22T16:38:34.677 回答
2

现在试试 recfile:http ://code.google.com/p/recfile/ 。我知道有一些努力可以为 NumPy 制作一个快速的 C/C++ 文件阅读器;它在我的 pandas 短待办事项列表中,因为它会导致此类问题。Warren Weckesser 在这里也有一个项目:https ://github.com/WarrenWeckesser/textreader 。不知道哪个更好,两个都试试?

于 2012-04-22T21:53:55.380 回答
1

你可以试试numpy.fromfile

http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html

于 2012-04-22T03:06:47.873 回答