我正在处理巨大的csv并注意到它正在逐渐增加内存。经过大量的打印退出和分析后,我认为是因为大熊猫在从csv读取时没有删除前一个数据帧而创建新的数据帧。
我使用pympler muppy
进行了分析。
下面我只是从csv读取4次迭代,它显示pandas.core.frame.Dataframe
的大小不断增加
iterator = pd.read_csv(downloaded_file, chunksize=chunksize,
compression='gzip', skipinitialspace=True, encoding='utf-8')
i = 1
for df in iterator:
all_objects = muppy.get_objects()
sum1 = summary.summarize(all_objects)
summary.print_(sum1)
i += 1
if i < 5:
continue
break
这给了我以下统计数据
types | # objects | total size
===================================== | =========== | ============
<class 'pandas.core.frame.DataFrame | 1 | 4.04 MB
types | # objects | total size
===================================== | =========== | ============
<class 'pandas.core.frame.DataFrame | 2 | 9.04 MB
types | # objects | total size
===================================== | =========== | ============
<class 'pandas.core.frame.DataFrame | 3 | 14.02 MB
types | # objects | total size
===================================== | =========== | ============
<class 'pandas.core.frame.DataFrame | 4 | 18.99 MB
我在6个进程中通过shell和多个子进程通过多处理池处理6个文件,每个超过10 gb。根据我的计算,我阅读的每个块几乎是2GB。因此,对于让我们说12进程它应该是24 gb并添加开销30 35gb ..但是我的脚本在内存中逐渐增加,并且随机间隔它也会大幅下降。但当它达到60gb这是我的服务器内存时,整个脚本都会被杀死。
这看起来内部有一些非线性的清理工作。