为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

吃鸡游戏 2021-06-11 14:50:05
语境我的小 Python 脚本使用一个库来处理一些相对较大的数据。此任务的标准算法是动态编程算法,因此推测库“幕后”分配了一个大数组来跟踪 DP 的部分结果。事实上,当我尝试给它相当大的输入时,它会立即给出一个MemoryError.最好不要深入研究库的深度,我想弄清楚是否值得在具有更多内存的另一台机器上尝试这个算法,或者尝试减少我的输入大小,或者它是否是一个失败的原因我正在尝试使用的数据大小。问题当我的 Python 代码抛出 a 时MemoryError,是否有一种“自上而下”的方式来调查我的代码尝试分配的导致错误的内存大小,例如通过检查错误对象?
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

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

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

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

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


查看完整回答
反对 回复 2021-06-22
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

您可以使用Pyampler查看内存分配,但您需要在您使用的库中本地添加调试语句。假设有一个标准的 PyPi 包,步骤如下:

  1. 在本地克隆包。

2 使用Pyampler 的summary 模块。在主递归方法中放置以下内容,

 from pympler import summary

   def data_intensive_method(data_xyz)

       sum1 = summary.summarize(all_objects)

       summary.print_(sum1)

       ...

  1. 运行pip install -e .以将编辑好的包安装到本地。

  2. 运行您的主程序并在每次迭代时检查控制台的内存使用情况。


查看完整回答
反对 回复 2021-06-22
?
慕神8447489

TA贡献1780条经验 获得超1个赞

似乎MemoryError没有使用任何关联数据创建:


def crash():

    x = 32 * 10 ** 9

    return 'a' * x


try:

    crash()

except MemoryError as e:

    print(vars(e))  # prints: {}

这是有道理的 - 如果没有记忆怎么办?


我认为没有捷径可走。您可以从MemoryError原因的回溯开始,并使用调试器进行调查或使用内存分析器,如pympler(或评论中建议的 psutil)。


查看完整回答
反对 回复 2021-06-22
  • 3 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信