【发布时间】: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