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

标签 python r pandas numpy kaggle

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

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

python session 耗尽了我所有的内存 (100%),然后被杀死了。

然后我使用 R(通过 read.table)读取同一个文件,它使用了不到 5GB 的 ram,在我调用垃圾收集器后崩溃到不到 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 的文件,并序列化输出矩阵。输入文件是“延迟”读取的,因此没有构建中间数据结构并且使用最少的内存。初始加载需要很长时间,但每次后续加载(序列化文件)都很快。如果您有提示,请告诉我!

关于python - 使用 numpy 读取 csv 文件的主要内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10264739/

相关文章:

python - 如何在 Pandas 数据框行中找到最后一个集群?

Python - ip <-> 子网匹配?

r - 使用 'shift' 中的序列和条件

python - 根据条件在多个数据帧的数据帧内的列之间交换行

python - 如何在python中将标称数据转换为数值?

python - 如何使用pandas groupby向每个组添加一行?

python - 在 Flask 中显示带换行符的文本字段

通过字典中的后代元素进行过滤的 Pythonic 方式

java - 安装 JRI 时遇到问题(R 到 java)

list - 从列表中查找唯一值