pandas read_csv 中最大化速度的最佳块大小是多少?

what is the optimal chunksize in pandas read_csv to maximize speed?

我正在使用一个 20GB(压缩的).csv 文件,我使用 pandas pd.read_csv() 和 chunksize=10,000 参数从中加载了几列。

但是,这个参数完全是任意的,我想知道一个简单的公式是否可以给我更好的块大小,从而加快数据的加载。

有什么想法吗?

没有"optimal chunksize"[*]。因为 chunksize 只告诉你每个块的 行数 ,而不是单个行的 内存大小 ,因此它没有意义尝试就此制定经验法则。 ([*] 虽然通常我只见过 100..64K 范围内的块大小)

要获得内存大小,您必须将其转换为每块内存大小或每行...

通过 查看您的列数、它们的 dtype 和每个列的大小;使用 df.describe(),或者更深入的内存使用,按列:

print 'df Memory usage by column...'
print df.memory_usage(index=False, deep=True) / df.shape[0]
  • 确保您在读取 ​​csv 时不会耗尽所有可用内存:使用您的 OS(Unix top/Windows Task Manager/MacOS Activity Monitor/etc) 查看占用了多少内存。

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

  • 并使用所有标准 pandas read_csv 技巧,例如:

    • 为每一列指定dtypes以减少内存使用 - 绝对避免每个条目都被读取为字符串,尤其是像日期时间这样的长唯一字符串,这对内存来说很糟糕用法
    • 如果您只想保留列的子集,请指定 usecols
    • 如果您想从 48 字节减少到 1 或 4,请使用 date/time-converters 而不是 pd.Categorical。
    • 分块读取大文件。而且,如果您预先知道要用什么来估算 NA/missing 值,那么如果可能的话,在处理每个块时尽可能多地进行填充,而不是在最后进行填充。如果您不能估算最终值,您可能至少可以替换为标记值,​​如 -1、999、-Inf 等,稍后您可以进行适当的估算。