pandas read_csv 中最大化速度的最佳块大小是多少?
Posted
技术标签:
【中文标题】pandas read_csv 中最大化速度的最佳块大小是多少?【英文标题】:what is the optimal chunksize in pandas read_csv to maximize speed? 【发布时间】:2016-05-16 01:42:39 【问题描述】:我正在使用一个 20GB(压缩)的 .csv 文件,并使用带有 chunksize=10,000 参数的 pandas pd.read_csv()
从中加载几列。
但是,这个参数是完全任意的,我想知道一个简单的公式是否可以给我更好的块大小来加速数据的加载。
有什么想法吗?
【问题讨论】:
配置文件并找出答案。 也许有一些通用公式,例如数据集大小的 1/10 或类似的东西(总 RAM 等) 根据我的回答,chunksize=10,000 只是每个块的 行数,而不是 memory-size。 “我使用pd.read_csv(chunksize...)
从中加载了几列” 你的意思是你加载行吗?您是否还意味着您删除了一些或大部分列?在这种情况下,您感兴趣的部分实际上不再是 20Gb 压缩文件。
【参考方案1】:
没有“最佳块大小”[*]。因为chunksize
只告诉你每个块的行数,而不是单行的内存大小,因此尝试制定规则是没有意义的-大拇指。 ([*] 虽然我通常只见过 100..64K 范围内的块大小)
要获得内存大小,您必须将其转换为每块内存大小或每行内存大小...
通过查看您的列数、它们的 dtype 以及每个列的大小;使用 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 strs 和对象占用 32 或 48 个字节,而不是 np.int32 的预期 4 个字节或 np.int32 的 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 等标记值替换,然后您可以进行适当的估算。
【讨论】:
以上是关于pandas read_csv 中最大化速度的最佳块大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用read_csv函数随机从文件中读取N行数据pandas使用read_csv函数读取空格分割的文件(space)自定义设置sep参数
Pandas.read_csv() FileNotFoundError 即使文件存在