我能找出导致我的 Python MemoryError 的分配请求吗?

语境

我的小 Python 脚本使用一个库来处理一些相对较大的数据。此任务的标准算法是动态编程算法,因此推测库“幕后”分配了一个大数组来跟踪 DP 的部分结果。事实上,当我尝试给它相当大的输入时,它会立即给出一个MemoryError.

最好不要深入研究库的深度,我想弄清楚是否值得在具有更多内存的另一台机器上尝试这个算法,或者尝试减少我的输入大小,或者它是否是一个失败的原因我正在尝试使用的数据大小。

问题

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


吃鸡游戏
浏览 243回答 3
3回答

潇湘沐

从MemoryError异常中看不到,任何内存分配失败的情况都会引发异常,包括 Python 内部没有直接连接到创建新 Python 数据结构的代码;一些模块会创建锁或其他支持对象,这些操作可能会由于内存耗尽而失败。您也不一定知道要使整个操作成功需要多少内存。如果库在操作过程中创建了多个数据结构,那么尝试为用作字典键的字符串分配内存可能是最后一根稻草,或者它可能会复制整个现有数据结构以进行变异,或者介于两者之间,但是这并没有说明需要多少内存,此外,对于该过程的其余部分。也就是说,Python 可以为您提供有关正在进行的内存分配以及使用tracemalloc模块的时间和地点的详细信息。使用该模块和实验方法,您可以估计完成数据集需要多少内存。诀窍是找到可以完成该过程的数据集。您希望找到不同大小的数据集,然后您可以测量这些数据结构需要多少内存。您可以在使用 前后创建快照tracemalloc.take_snapshot(),比较这些数据集快照之间的差异和统计数据,也许您可以从该信息推断更大的数据集需要多少内存。当然,这取决于操作的性质和数据集,但如果有任何类型的模式tracemalloc是发现它的最佳机会。

慕尼黑的夜晚无繁华

您可以使用Pyampler查看内存分配,但您需要在您使用的库中本地添加调试语句。假设有一个标准的 PyPi 包,步骤如下:在本地克隆包。2 使用Pyampler 的summary 模块。在主递归方法中放置以下内容, from pympler import summary   def data_intensive_method(data_xyz)       sum1 = summary.summarize(all_objects)       summary.print_(sum1)       ...运行pip install -e .以将编辑好的包安装到本地。运行您的主程序并在每次迭代时检查控制台的内存使用情况。

慕神8447489

似乎MemoryError没有使用任何关联数据创建:def crash():    x = 32 * 10 ** 9    return 'a' * xtry:    crash()except MemoryError as e:    print(vars(e))  # prints: {}这是有道理的 - 如果没有记忆怎么办?我认为没有捷径可走。您可以从MemoryError原因的回溯开始,并使用调试器进行调查或使用内存分析器,如pympler(或评论中建议的 psutil)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python