我从 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/