Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以找出导致Python内存错误的分配请求吗? 上下文_Python_Python 3.x_Error Handling_Out Of Memory - Fatal编程技术网

我可以找出导致Python内存错误的分配请求吗? 上下文

我可以找出导致Python内存错误的分配请求吗? 上下文,python,python-3.x,error-handling,out-of-memory,Python,Python 3.x,Error Handling,Out Of Memory,我的小Python脚本使用一个库来处理一些相对较大的数据。此任务的标准算法是动态规划算法,因此“引擎盖下”库可能会分配一个大型数组来跟踪DP的部分结果。事实上,当我尝试给它相当大的输入时,它会立即给出一个MemoryError 最好不要深入挖掘库的深度,我想弄清楚是否值得在另一台拥有更多内存的机器上尝试此算法,或者尝试减少一点输入大小,或者这是否是我尝试使用的数据大小丢失的原因 问题: 当我的Python代码抛出一个MemoryError时,是否有一种“自上而下”的方法来调查我的代码试图分配的导

我的小Python脚本使用一个库来处理一些相对较大的数据。此任务的标准算法是动态规划算法,因此“引擎盖下”库可能会分配一个大型数组来跟踪DP的部分结果。事实上,当我尝试给它相当大的输入时,它会立即给出一个
MemoryError

最好不要深入挖掘库的深度,我想弄清楚是否值得在另一台拥有更多内存的机器上尝试此算法,或者尝试减少一点输入大小,或者这是否是我尝试使用的数据大小丢失的原因

问题:
当我的Python代码抛出一个
MemoryError
时,是否有一种“自上而下”的方法来调查我的代码试图分配的导致错误的内存大小,例如通过检查错误对象?

似乎
MemoryError
不是用任何相关数据创建的:

def crash():
    x = 32 * 10 ** 9
    return 'a' * x

try:
    crash()
except MemoryError as e:
    print(vars(e))  # prints: {}
这是有道理的——如果没有记忆怎么可能呢


我认为没有简单的出路。您可以从
MemoryError
引起的回溯开始,使用调试器或类似(或注释中建议的psutil)的内存探查器进行调查。

您无法从
MemoryError
异常中看到异常,并且对于内存分配失败的任何情况都会引发异常,包括不直接连接到创建新Python数据结构的代码的Python内部构件;一些模块创建锁或其他支持对象,这些操作可能会由于内存耗尽而失败

您也不一定知道整个操作成功需要多少内存。如果库在操作过程中创建了多个数据结构,那么为用作字典键的字符串分配内存可能是最后一根稻草,也可能是复制整个现有数据结构以进行变异,或者是介于两者之间的任何操作,但这并不能说明需要多少内存,对于流程的其余部分

也就是说,Python可以为您提供关于正在进行的内存分配的详细信息,以及何时何地使用。使用该模块和实验方法,您可以估计完成数据集需要多少内存


诀窍是找到过程可以完成的数据集。您希望找到不同大小的数据集,然后可以测量这些数据结构需要多少内存。您可以在使用之前和之后创建快照,比较这些数据集的快照之间的差异,也许您可以根据这些信息推断出更大的数据集需要多少内存。当然,这取决于操作和数据集的性质,但是如果存在任何类型的模式,tracemalloc是发现它的最佳途径。

您可以通过查看内存分配,但需要在正在使用的库中本地添加调试语句。假设采用标准PyPi包,以下是步骤:

  • 在本地克隆包
  • 2.使用Pyampler。将以下内容放在主递归方法中

       from pympler import summary
       def data_intensive_method(data_xyz)
           sum1 = summary.summarize(all_objects)
           summary.print_(sum1)
           ...
    
  • 运行
    pip install-e.
    在本地安装编辑的软件包
  • 运行主程序并在每次迭代时检查控制台的内存使用情况

  • 这是关于MemoryError的一个很好的概述:。您正在使用的DP库是什么?非常大的输入的大小是多少?与博客文章中的强制越界类似,您可以尝试循环并基于N分配内存,然后将其丢弃,直到失败。这会告诉你N在哪里分解。至于您直接提出的问题,“如何调查代码试图分配的内存大小是导致错误的原因”,我没有看到任何明显的迹象。有趣的问题@ScottSkiles,在这一点上,我的实际问题或多或少已经用一个近似/概率的解决方案解决了,这只是我对Python中的错误对象的好奇。上下文只是为了弄清楚为什么一个人可能关心这个问题,并且大部分是与实际问题分开的。该算法用于计算Levenshtein距离的一个变量以进行近似的子字符串匹配,我的数据(如果我没有记错的话)约为一百万个字符。从@ScottSkiles引用的文章中,似乎可以在错误处理中使用它来获取要查找的内存使用率数据。也就是说,我不知道如何根据您的问题从错误本身获取此信息。@ScottSkiles@benvc如果您中的任何一位愿意将关于
    psutil
    的事实转化为答案,我很乐意接受并奖励赏金。@benvc继续。我在旅行。