耗尽内存,需要替代方案

时间:2016-11-29 18:13:46

标签: python pandas pivot

我正在尝试运行以下代码:

start_time = time.time()
csvWriter = ModalitySessions.pivot(index='session_id', columns='context_eid', values='name')
print("--- %s seconds ---" % (time.time() - start_time))

这给了我以下错误:

ValueError: negative dimensions are not allowed

我在网上发现了类似的问题,似乎它可能是一个潜在的内存问题。所以我尝试在数据子集上运行相同的代码,这确实是一个内存问题。这是更新后的代码:

start_time = time.time()
csvWriter = ModalitySessions.iloc[:2000000].pivot(index='session_id', columns='context_eid', values='name')
print("--- %s seconds ---" % (time.time() - start_time))

这给了我一个MemoryError

有人会对如何解决这个问题有任何想法吗?我正在处理~350万个会话,并且枢轴应该返回大约900列。

2 个答案:

答案 0 :(得分:1)

您可以将原始数据拆分为较小的块,并将其各自的旋转结果附加到另一个初始化为空的容器中。你当然需要一个处理附加片段的过程的函数。就像在迭代你正在构造的容器表的元素的东西,并与刚刚处理过的块组成的新透视表的元素进行比较,并在列字段匹配时添加值。虽然非常低效(就计算时间而言)(取决于你将初始表分成多少块),我认为它会解决你的问题,因为你会一次处理较小的数据块,因为它出现是某种环绕错误。

答案 1 :(得分:1)

您可以构建Python generator以一次返回CSV数据的块。实际上,这就是Python中存在这样一个工具的原因。然后可以使用生成器来限制任何时候加载到内存中的行的nubmer。

要么就是我在评论中提到的,请查看high memory VPS