我正在尝试运行以下代码:
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列。
答案 0 :(得分:1)
您可以将原始数据拆分为较小的块,并将其各自的旋转结果附加到另一个初始化为空的容器中。你当然需要一个处理附加片段的过程的函数。就像在迭代你正在构造的容器表的元素的东西,并与刚刚处理过的块组成的新透视表的元素进行比较,并在列字段匹配时添加值。虽然非常低效(就计算时间而言)(取决于你将初始表分成多少块),我认为它会解决你的问题,因为你会一次处理较小的数据块,因为它出现是某种环绕错误。
答案 1 :(得分:1)
您可以构建Python generator以一次返回CSV数据的块。实际上,这就是Python中存在这样一个工具的原因。然后可以使用生成器来限制任何时候加载到内存中的行的nubmer。
要么就是我在评论中提到的,请查看high memory VPS。