【问题标题】:Python 3.6: Why does pickle.dumps(nparray) permanently increase refcount?Python 3.6:为什么 pickle.dumps(nparray) 会永久增加引用计数?
【发布时间】:2019-01-19 16:07:29
【问题描述】:

np.ndarray 在腌制时会从转储函数中增加引用计数器,但是引用计数永远不会减少。

Python 3.6.4 蟒蛇 Ubuntu 16.04.5 LTS numpy 1.16.0

我已经尝试使用 numpy.array.tolist() 转换为列表,但是这种方法太慢了。

import numpy as np
import pickle
import sys

a = np.ndarray((10, 10), dtype=np.uint8)
print(sys.getrefcount(a)) # 2
pickle.dumps(a)
print(sys.getrefcount(a)) # 3

由于 pickler 转储函数中出现 Py_DECREF,我希望输出为 2、2,但它仍然存在。

输出为 2、3,我无法修复它。我正在疯狂地泄漏内存。

目前正在研究 _pickle.c。

【问题讨论】:

  • frame 只是相当标准的 numpy.ndarray() 实例。你能在没有cv2 而只使用frame = np.zeros((10, 10), dtype=np.uint8) 的情况下重现这个问题吗?
  • 另外,这是 Python 3.6 的确切版本,是在什么操作系统上运行的?
  • @MartijnPieters 我在 Python 3.6.8 Anaconda ubuntu 16.04.5 LTS 上。我会尝试用 np.zeros 重现。感谢您的建议!将再次评论结果。
  • @MartijnPieters 我只用 np.zeros 就能重现。 Numpy refcount 递增而不会递减。这甚至发生在 ndarray.dumps()
  • 是的,所以我们在一些更简单的地方。你能更新你的问题吗?但是,您可能需要考虑向 numpy 项目提交错误报告。

标签: python numpy automatic-ref-counting


【解决方案1】:

您遇到了this specific bug,它只是 Numpy 1.16.0 中的回归。添加对a new pickle protocol 5 支持的新代码在回退情况下泄漏了对绑定__reduce__ 方法的引用。

您可以等待修复该错误并发布 1.16.1,或者返回到 Numpy 1.15.4。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2019-11-12
    • 2016-06-03
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    相关资源
    最近更新 更多