Mee*_*ies 17 python error-handling out-of-memory python-3.x
我的小Python脚本使用库来处理一些相对较大的数据.此任务的标准算法是动态编程算法,因此可能是"引擎盖下"的库分配了一个大型数组来跟踪DP的部分结果.实际上,当我尝试给它相当大的输入时,它会立即给出一个MemoryError.
最好不要深入挖掘库的深度,我想弄清楚是否值得在具有更多内存的不同机器上尝试此算法,或者尝试减少我的输入大小,或者如果它是丢失的原因我试图使用的数据大小.
当我的Python代码抛出时MemoryError,是否有一种"自上而下"的方式来调查我的代码试图分配的内存大小是什么导致了错误,例如通过检查错误对象?
从异常中你看不到,任何MemoryError内存分配失败的情况都会引发异常,包括不直接连接到创建新Python数据结构的代码的Python内部;某些模块会创建锁或其他支持对象,并且这些操作可能会由于内存耗尽而失败。
您也不一定知道整个操作成功需要多少内存。如果库在操作过程中创建了多个数据结构,则尝试为用作字典键的字符串分配内存可能是最后一根稻草,或者它可能会复制整个现有数据结构以进行突变,或者介于两者之间的任何内容,但是此外,这并没有说明该过程的其余部分将需要多少内存。
也就是说,Python 可以为您提供有关使用tracemalloc模块进行哪些内存分配以及何时何地进行的内存分配的详细信息。使用该模块和实验方法,您可以估计完成数据集需要多少内存。
诀窍是找到可以完成该过程的数据集。您想要找到不同大小的数据集,然后可以测量这些数据结构需要多少内存。您可以在使用之前和之后创建快照tracemalloc.take_snapshot(),比较这些数据集的快照之间的差异和统计信息,也许您可以从该信息推断出较大的数据集需要多少内存。当然,这取决于操作的性质和数据集,但如果存在任何类型的模式,则tracemalloc是发现它的最佳机会。