python - pandas read_csv 中最大化速度的最佳 block 大小是多少?

标签 python pandas memory io chunks

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

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

有什么想法吗?

最佳答案

没有“最佳 block 大小”[*]。因为chunksize只告诉您每个 block 的行数,而不是单个行的内存大小,因此尝试对此制定经验法则毫无意义。 ([*] 虽然通常我只见过 100..64K 范围内的 block 大小)

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

通过查看您的列数、它们的数据类型以及每列的大小;使用 df.describe() ,或者更深入的内存使用情况,按列:

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

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

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

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

关于python - pandas read_csv 中最大化速度的最佳 block 大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235010/

相关文章:

python - ConfigObj 获取包含子部分的部分列表的方法

Python 调用使用 MPI 的 (fortran) 库

python - Pandas 多索引 : Divide all columns by one column

r - 如何在 Shiny 的应用程序中使用多个过滤器有效处理数据

Java app通过JNI调用C++ DLL;如何最好地分配内存?

python - 查找列表列表的最长公共(public)前缀的 Pythonic 方法是什么?

java - 我的类在 jar 中找不到 python 文件

r - 使用首先处理的年份创建新变量

python - 获取分类变量的类别列表(Python Pandas)

linux - htop 显示的常驻内存使用量多于机器的内存使用量