【发布时间】:2014-11-07 16:47:43
【问题描述】:
我目前的代码可以工作,如果我只做大约 5 次迭代,但我需要做 500 次,它就可以工作。下面指示的循环正在拉动大约 100 gig 的 RAM 使用量(在一台好机器上),我不知道为什么.我怀疑这与我正在运行的双重面具有关(也如下所示)
我正在处理的“框架”并不是特别大(相比之下),它由 500 只股票及其从 1994 年到 2014 年的每日时间序列价格组成。下面的循环正在做的是从“框架”并根据某些因库存而异的给定日期屏蔽该列。然后它需要所有这些被屏蔽的列并将它们重新连接到一个新的数据帧中(我想不出一种就地方式来做到这一点)。我认为正是这种双重面具导致记忆爆炸。有没有其他人处理过这样的问题或知道如何解决它?
frame=pd.DataFrame()
for i in range(len(columns)):
frame=frame.join(serieslist[i], how='outer', rsuffix=columns[i])
frame2=frame.rename(columns={'PRC': 'PRC'+str(columns[0])})
frame2.to_csv('tester.csv')
frame4=frame2.rename(columns=lambda x: x[3:])
#now chopping it down to 36-1, 24-1 and 12-1
ann_list=data[' DateEffective']
for i in range(len(ann_list)):
ann_list[i]=parser.parse(ann_list[i])
months36=datetime.timedelta(36*365/12)
############This is the loop that explodes in memory use#################
frame5fin=pd.DataFrame()
for i in range(len(columns)):
out36=(ann_list[i]+months36)
##########I am nearly positive this is the part of the code that makes the RAM explode####
frame5=frame4[columns[i]][(frame4[columns[i]].index>ann_list[i]) & (frame4[columns[i]].index<out36)]
print frame5
frame5fin=frame5fin.join(frame5, how='outer')
print frame5fin.tail(100)
【问题讨论】:
-
你真的打算在循环结束时在 frame5fin 和 frame5 之间进行连接吗?也许这应该是一个追加?似乎在每次迭代后 frame5fin 都会成倍增长。
-
@JD Long-您能解释一下为什么它会“呈指数级增长”吗?在我看来,这将是线性的。我认为这是我问题的症结所在。为什么是指数级?
-
当您使用数据子集对其进行测试时,连接是否符合您的预期?试图阅读你的代码(很难做到)我猜
frame4和frame5有许多共同的列以及一个共同的索引。当您加入这些 Pandas 时,会尝试匹配每列中的每个值。随着frame5in变大,这个连接会大大减慢。你是对的,它可能是速度的线性下降。但是,我怀疑您不想根据每一列加入。但是我发现读懂你的想法非常困难。 -
如果你想保留缺失值,你可以考虑使用 append 方法,然后在你完成循环之后,你可以获取结果并重新索引它以添加没有数据的日期。
标签: python pandas ram timedelta