在pandas中,read_csv函数的最佳chunksize是多少才能达到最大速度?

13
我正在使用一个20GB(经过压缩的).csv文件,并使用pandas的pd.read_csv()从中加载了几列,chunksize参数设置为10,000。
但是,这个参数完全是任意的,我想知道是否有一个简单的公式可以给我更好的chunksize,以加快数据的加载速度。
您有什么建议吗?

5
个人资料并查找。 - Colonel Thirty Two
1
也许有一些通用的公式,比如数据集大小的1/10或类似的东西(总RAM等)。 - ℕʘʘḆḽḘ
chunksize=10,000 只是每个块的行数,而不是内存大小,详见我的回答。 - smci
"我使用 pd.read_csv(chunksize...) 从中加载了几列。你肯定是指你加载了行吧?你是否还删除了一些或大多数列?如果是这样,那么你感兴趣的部分实际上不再是一个20GB压缩文件了。" - smci
1个回答

20

没有"最佳块大小" [*]。 因为chunksize只告诉您每个块的行数,而不是单个行的内存大小,因此试图基于此制定经验法则是没有意义的。([*]尽管通常我只看到范围在100..64K之间的块大小)

要获取内存大小,您需要将其转换为每个块或每行的内存大小...

通过查看列数、它们的数据类型和每个列的大小来实现;使用df.describe(),或者更深入地了解按列使用的内存:

print 'df Memory usage by column...'
print df.memory_usage(index=False, deep=True) / df.shape[0]
  • 读取csv文件时要确保不要耗尽所有的可用内存:使用您的操作系统(Unixtop/Windows任务管理器/MacOS活动监视器等)查看正在使用多少内存。

  • pandas的一个陷阱是缺失/NaN值、Python字符串和对象占用32或48字节,而不是np.int32的预期4字节或np.int8列的1字节。即使整个列中只有一个NaN值,也会导致整个列的内存爆炸,并且pandas.read_csv() dtypes、converters、na_values参数将不会防止np.nan,并忽略所需的dtype(!)。一种解决方法是在插入数据帧之前手动后处理每个块。

  • 使用所有标准的pandasread_csv技巧,例如:

    • 为每个列指定dtypes以减少内存使用 - 绝对避免将每个条目都读取为字符串,特别是像日期时间这样的长唯一字符串,这对于内存使用非常糟糕
    • 如果仅想保留子集,请指定usecols
    • 使用日期/时间转换器而不是pd.Categorical,如果要将其从48字节减少到1或4。
    • 在块中读取大文件。如果您事先知道要用什么填充NA/缺失值,如果可能的话,请尽量在处理每个块时进行大部分填充,而不是在最后进行。如果无法用最终值填充,则可能至少可以用像-1、999、-Inf等的标记值替换,并稍后进行适当的填充。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接