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

vgo*_*ani 9 python numpy r pandas kaggle

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

data = np.loadtxt('rec_log_train.txt')
Run Code Online (Sandbox Code Playgroud)

python会话占用了我所有的记忆(100%),然后被杀死了.

然后,我使用R(通过read.table)读取相同的文件,并使用少于5GB的ram,在我调用垃圾收集器后崩溃到小于2GB.

我的问题是为什么这会在numpy下失败,以及将文件读入内存的正确方法是什么.是的我可以使用发电机并避免问题,但这不是目标.

vgo*_*ani 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)
Run Code Online (Sandbox Code Playgroud)

这将读取2.5GB文件,并序列化输出矩阵.输入文件以"懒惰"方式读取,因此不会构建中间数据结构并使用最少的内存.初始加载需要很长时间,但每个后续加载(序列化文件的加载)都很快.如果您有提示,请告诉我!