Python 内存不足,需要其他选择

Python 内存不足,需要其他选择,python,pandas,pivot,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.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))
这给了我一个
内存错误


有人知道如何解决这个问题吗?我正在处理大约350万个会话,数据透视应该返回大约900列。

您可以将原始数据分解成更小的数据块,并将它们各自的数据透视结果附加到另一个初始化为空的容器中。当然,您需要一个函数来处理附加片段的过程。如中所示,在正在构造的容器表的元素上进行迭代,并与由刚刚处理的块组成的新数据透视表的元素进行比较,如果列字段匹配,则添加值。虽然效率极低(在计算时间方面)(取决于您将初始表划分为多少个块),但我认为这会解决您的问题,因为您一次要处理的数据块较小,因为这似乎是某种概括错误。

您可以将原始数据分解成更小的数据块,并将它们各自的数据透视结果附加到另一个初始化为空的容器中。当然,您需要一个函数来处理附加片段的过程。如中所示,在正在构造的容器表的元素上进行迭代,并与由刚刚处理的块组成的新数据透视表的元素进行比较,如果列字段匹配,则添加值。虽然效率极低(在计算时间方面)(取决于您将初始表划分为多少个块),但我认为这会解决您的问题,因为您一次要处理的数据块较小,因为这似乎是某种概括错误。

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


或者,正如我在评论中提到的,查看一个。您可以构建一个Python,一次返回CSV数据块。事实上,这就是Python中存在这样一个工具的原因。然后,可以使用生成器随时限制加载到内存中的行数


或者,正如我在评论中提到的,研究一个。

什么是
ModalitySessions
?有时简单的解决方案就是在高内存环境中运行它,比如DigitalOcean的高内存VPS:大规模计算总是存在硬件限制。我用C语言编写了遗传算法,尽管进行了优化,但仍然需要高内存环境。何况
ModalitySessions
?有时简单的解决方案就是在高内存环境中运行,比如DigitalOcean的高内存VPS:大规模计算总是存在硬件限制。我已经用C语言编写了遗传算法,尽管进行了优化,但仍然需要高内存环境。谢谢,我将试用生成器。我还想知道我是否可以用
shortint
替换
session\u id
、'context\u eid`和
name
(基本上创建3个映射并将其存储在其他地方),因为
string
数据类型将比
shortint
或其他东西占用更多内存。。你有这方面的经验吗?关于这听起来是否是个不错的主意,有什么一般性的评论吗?如果内存不足,将内容移动到不同的映射可能无法解决问题。您仍在存储相同数量的信息(可能有一些改进)。你说的是数量级。如果你的内存仍然超过了10倍,那么一点小小的改进也无济于事。谢谢,我会试试发电机。我还想知道我是否可以用
shortint
替换
session\u id
、'context\u eid`和
name
(基本上创建3个映射并将其存储在其他地方),因为
string
数据类型将比
shortint
或其他东西占用更多内存。。你有这方面的经验吗?关于这听起来是否是个不错的主意,有什么一般性的评论吗?如果内存不足,将内容移动到不同的映射可能无法解决问题。您仍在存储相同数量的信息(可能有一些改进)。你说的是数量级。如果你的内存仍然超过了10倍,那么一点小小的改进也无济于事。谢谢,我会试试这个方法。我还想知道是否可以用shortint替换session_id、'context_eid`和name(基本上创建3个映射并将其存储在其他地方),考虑到字符串数据类型将比shortint或其他东西占用更多内存。。你有这方面的经验吗?对这听起来是否是个好主意有什么一般性的评论吗?是的,你可以这么做。理论上,新的数据类型占用的内存更少。务必检查值范围是否存在短路。但是要考虑到,您必须在每次迭代之前至少迭代整个表一次,并且,根据hashmap的实现,您可能需要将每一行的元素与正在构建的整个hashmap进行比较。从本质上讲,你在实践中遇到的难题有时会在计算中出现:你有空间复杂性(需要大量内存)或时间复杂性(需要大量时间)。谢谢你的评论。当信息同步时,谁会关心语法呢