2

我正在运行一个 tensorflow 模型,该模型在处理大图像时会在大约 10 分钟内耗尽 60G 的 RAM。

我已经运行 Heapy 试图确定泄漏,但 heapy 仅显示 90M 的内存使用量并且保持不变。

我注意到这篇文章:Python 进程消耗越来越多的系统内存,但 heapy 显示大致恒定的使用情况

这表明问题可能出在带有内存碎片的python(此处为2.7)中。但这听起来不像是对本案的合理解释。

  • 我有 2 个 python 队列。在一个中,我从磁盘读取图像并raw使用线程将其加载到队列中。
  • 在另一个线程中,我读取raw队列、预处理并将其加载到ready队列中。
  • 在我的主线程中,我从队列中批量绘制 8 张图像,ready并通过 tensorflow 训练运行它们。
  • 对于 8 个图像批次(每个 ~25MB numpy 矩阵),我应该在任何给定时间在当前处理和两个队列之间至少保留 24 * 25MB 的内存。但是heapy只显示了90M的消耗。

所以 heapy 没有看到至少 600M 的内存,我知道在任何给定的时刻都必须持有。

因此,如果 heapy 看不到我知道的内存,我就不能相信它会看到泄漏的位置。以它泄漏的速度,几乎可以肯定是成批的图像导致了它。

我正在使用threadingpython 中的模块来启动加载器和预处理器线程。我试过print h.heap()从线程代码和主代码中调用,结果都一样。

4

1 回答 1

1

我最终Queue意外地拥有了一条无界的蟒蛇。简单的修复。奇怪的是 heapy 没有显示队列分配的内存。好吧,memory_profiler确实如此,因此我找到了这个问题。

Queue如果 heapy 说:“嘿,这个对象使用的内存比你预期的要多”,那肯定是一件美好的事情。

于 2017-04-08T22:36:27.313 回答