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

上下文

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

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

问题:

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

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

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

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

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

发表评论