我正在使用一个20GB(压缩的).csv文件,我使用pandas pd.read_csv()
和chunksize = 10,000参数从中加载了几列。
然而,这个参数完全是任意的,我想知道一个简单的公式是否可以给我更好的chunksize,这将加速数据的加载。
有什么想法吗?
答案 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