【发布时间】:2016-11-24 01:10:11
【问题描述】:
所以我一直在尝试使用 pandas read_csv 函数读取内存中的 3.2GB 文件,但我一直遇到某种内存泄漏,我的内存使用量会飙升 90%+。
作为替代品
我尝试定义
dtype以避免将内存中的数据作为字符串保存,但看到了类似的行为。尝试了 numpy read csv,以为我会得到一些不同的结果,但肯定是错的。
尝试逐行阅读时遇到了同样的问题,但速度真的很慢。
我最近迁移到 python 3,所以认为那里可能存在一些错误,但在 python2 + pandas 上看到了类似的结果。
有问题的文件是来自 kaggle 比赛grupo bimbo的 train.csv 文件
系统信息:
RAM: 16GB, Processor: i7 8cores
如果您还想了解其他信息,请告诉我。
谢谢:)
编辑 1:这是一个内存峰值!不是泄漏(对不起。)
编辑 2:csv 文件示例
Semana,Agencia_ID,Canal_ID,Ruta_SAK,Cliente_ID,Producto_ID,Venta_uni_hoy,Venta_hoy,Dev_uni_proxima,Dev_proxima,Demanda_uni_equil
3,1110,7,3301,15766,1212,3,25.14,0,0.0,3
3,1110,7,3301,15766,1216,4,33.52,0,0.0,4
3,1110,7,3301,15766,1238,4,39.32,0,0.0,4
3,1110,7,3301,15766,1240,4,33.52,0,0.0,4
3,1110,7,3301,15766,1242,3,22.92,0,0.0,3
编辑3:文件中的行数74180465
还有一个简单的pd.read_csv('filename', low_memory=False)
我试过了
from numpy import genfromtxt
my_data = genfromtxt('data/train.csv', delimiter=',')
更新 下面的代码刚刚工作,但我还是想深入了解这个问题,一定有问题。
import pandas as pd
import gc
data = pd.DataFrame()
data_iterator = pd.read_csv('data/train.csv', chunksize=100000)
for sub_data in data_iterator:
data.append(sub_data)
gc.collect()
编辑:一段有效的代码。 感谢所有帮助人员,我通过添加 python dtypes 而不是 numpy 来搞乱我的 dtypes。一旦我修复了下面的代码就像一个魅力。
dtypes = {'Semana': pd.np.int8,
'Agencia_ID':pd.np.int8,
'Canal_ID':pd.np.int8,
'Ruta_SAK':pd.np.int8,
'Cliente_ID':pd.np.int8,
'Producto_ID':pd.np.int8,
'Venta_uni_hoy':pd.np.int8,
'Venta_hoy':pd.np.float16,
'Dev_uni_proxima':pd.np.int8,
'Dev_proxima':pd.np.float16,
'Demanda_uni_equil':pd.np.int8}
data = pd.read_csv('data/train.csv', dtype=dtypes)
这将内存消耗降低到略低于 4Gb
【问题讨论】:
-
这听起来不像是内存泄漏。这听起来就像你试图一次将一个巨大的文件读入内存并导致大量的内存消耗。 (内存中的表示大于序列化形式是完全正常的。)
-
内存泄漏 = 已分配但从未释放的内存。这不是这里的情况。峰值根本不意味着内存泄漏。
-
@limbo 感谢您的更正,但 3.2Gb 文件的 10Gb+ 使用量确实感觉不对。
-
你能写一个数据的示例行吗?
-
@heaven00 不用担心,我们都在这里学习。我也对此感到有些困惑。你能告诉我们你使用的代码吗?