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下失败,以及将文件读入内存的正确方法是什么.是的我可以使用发电机并避免问题,但这不是目标.
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文件,并序列化输出矩阵.输入文件以"懒惰"方式读取,因此不会构建中间数据结构并使用最少的内存.初始加载需要很长时间,但每个后续加载(序列化文件的加载)都很快.如果您有提示,请告诉我!
| 归档时间: |
|
| 查看次数: |
2706 次 |
| 最近记录: |