import psutil
def calc_chunksize(df, share=0.3):
"""Estimate optimal chunksize (in records) for writing large dfs with df.to_csv"""
# get approximate record size in bytes
row_size = df.memory_usage(index=True, deep=True).sum() / df.index.size
# get share of available memory size in bytes
avail_mem = psutil.virtual_memory().available * share
return int(avail_mem / row_size)
2条答案
按热度按时间eyh26e7m1#
别太过火了。想想你得到了什么,失去了什么。
使用更大的内存缓冲区可以保存什么:
使用更大的缓冲区会损失什么:
根据我的经验,对于本地文件系统,4 kiB - 64 kiB的传输大小是不错的。对于网络文件系统,您可能希望更大,例如1 MiB。但没有硬边界。你只会得到递减的回报,在某个时候会稍微慢下来。
现在的问题是,您以行而不是字节为单位给予大小。这取决于你的格式。当然,您可以估计行的大小,但我认为这是多余的,因为您不需要精确。每行80个字符,则每4 kiB有51行,每64 kiB有819行,每1 MiB有13107行。因此,使用100、1000或10,000行似乎是合理的。
当然,你可以简单地对它进行基准测试。
在我的系统中,块大小为100时,我在4.3秒内获得100万行,1000时为3.6秒,10,000时为3.4秒,100,000时为3.6秒。
大部分时间都花在了格式化输出上。缓冲区大小是次要的。取一个合理的数字,然后完成它。如果有的话,花时间切换到更合理的二进制格式。
6kkfgxo02#
可能的策略之一:
根据您自己的判断来管理
share
属性(考虑到其他进程根据其活动可能动态地需要一些可用内存)。