我目前正在使用Pandas处理大约600MB的csv源文件进行一个项目。在分析过程中,我将csv读入数据帧,按一些列进行分组,然后对分组的数据帧应用简单的函数。我注意到在这个过程中进入了Swap Memory,所以进行了一个基本测试:
我首先在shell中创建了一个相当大的数据帧:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3000000, 3),index=range(3000000),columns=['a', 'b', 'c'])
我定义了一个毫无意义的函数,它叫做do_nothing():
def do_nothing(group):
return group
然后运行了以下命令:
df = df.groupby('a').apply(do_nothing)
我的系统有16gb的RAM,运行的是Debian (Mint)。在创建了数据框之后,我正在使用大约600mb的RAM。一旦开始执行apply方法,该值就开始飙升。它稳步上升到约7gb(!),然后完成命令并回落到5.4gb(而shell仍处于活动状态)。问题是,我的工作需要执行更多的操作而不仅仅是“do_nothing”方法,因此当执行真正的程序时,我会限制我的16gb RAM,并开始交换,使程序无法使用。这是故意的吗?我看不出Pandas为什么要使用7gb的RAM来有效地执行“do_nothing”,即使它必须存储分组对象。
有什么想法是什么导致这个问题/如何修复它吗?
谢谢,
.P
do_nothing
的每个组都是DataFrame,因此您正在创建3百万个DataFrames(然后apply
必须将其聚合成单个结果)。即使每个仅有一行,这也是很多开销。创建一个“分组性”(即不同分组的数量)与实际数据更符合的示例可能更加明显。 - BrenBarndo_nothing
返回1而不是group
,会发生什么? - BrenBarn