如何从内存中删除流?

How to remove a stream from memory?

我有一个使用 Picamera library. I use the PicameraCircularIO stream object, that inherits from the CircularIO class (still a class form the Picamera library), which inherits from the native Python BytesIO class.

的运动检测脚本

问题是,当记录到循环流中,然后将流的内容写入磁盘时,内存没有被清除。

流写入磁盘后,这就是我所做的:

stream.seek(0)
stream.truncate()

我也试过调用 stream.flush() and/or 关闭流:stream.close(),但没有帮助。

我还尝试删除对流的所有引用以便对其进行垃圾回收(尽管这样做没有任何意义,因为将流截断到大小 0 通常应该可以完成工作...)。流在一个数组中,所以我做了 del streams[index]。它没有用,所以我也尝试手动调用垃圾收集器:gc.collect(),没有效果。

在内存中计算的只是流中写入的字节数,而不是流大小。因此,例如,如果将 2125000 字节写入流然后我将其截断,内存中仍将有 2125000 字节。

任何 tip/trick/answer 不胜感激。

干杯!

gc.collect 将内存标记为未使用。由于您的程序需要更多内存,因此它应该重用该内存。但是,它可能不会将该内存释放回 OS,因此 OS 将继续报告已使用的内存。一般来说,python 个进程倾向于保留它们的内存而不释放它,因此它们的总内存占用量将代表它们的内存使用量 'high water mark'。

在你的情况下,这应该没问题,因为你正在释放流。如果您开始使用另一个流,它应该重复使用相同的 space 并且您的 'top' 报告不应显示大小增加。

有关更详细的说明,请参阅 Releasing memory in Python