什么是pandas read_csv中最佳的chunksize以最大化速度?

时间:2016-02-05 23:01:36

标签: python pandas memory io chunks

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

然而,这个参数完全是任意的,我想知道一个简单的公式是否可以给我更好的chunksize,这将加速数据的加载。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

chunksize只会告诉您每个块的的数量,因此制定一个经验法则毫无意义。

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

通过查看您的列数,数量,以及每个的大小;使用 df.describe() ,或者按列添加更深入的内存使用情况:

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

  • pandas的一个缺陷是缺少/ NaN值,Python strs和对象需要32或48个字节,而不是np.int32的预期4个字节或np的1个字节。 int8列。 即使整个列中的一个NaN值也会导致整个列上的内存爆炸,而pandas.read_csv() dtypes, converters, na_values参数也不会阻止np.nan,并且会忽略所需的dtype(!)。解决方法是在插入数据框之前手动对每个块进行后处理。

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

    • 为每列指定dtypes以减少内存使用量 - 绝对避免每个条目被读取为字符串,尤其是像日期时间这样长的唯一字符串,这对于内存使用来说很糟糕
    • 如果您只想保留列的子集,请指定usecols
    • 使用日期/时间转换器而不是pd.Categorical,如果您想将48个字节减少到1或4个。
    • 以块的形式阅读大文件。如果你事先知道你要用什么来计算NA /缺失值,那么尽可能多地处理每个块,而不是最后。如果你不能用最终值来估算,你可能至少可以用-1,999,-Inf等哨兵值替换,之后你可以做正确的估算。