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