如何从内存中删除流?

时间:2015-11-02 01:28:06

标签: python memory-management stream garbage-collection video-streaming

我有一个使用Picamera库的动作检测脚本。我使用PicameraCircularIO流对象,它继承自CircularIO类(仍然是Picamera库的类),它继承自本地Python BytesIO类。

问题是当录制到循环流然后在磁盘上写入流的内容时,内存不会被清除。

在磁盘上写入流后,我就是这样做的:

stream.seek(0)
stream.truncate()

我也尝试过调用stream.flush()和/或关闭广告资源:stream.close(),但它没有帮助。

我还尝试删除对流的所有引用以使其被垃圾收集(即使这样做没有任何意义,因为将流截断为0通常应该完成工作......)。流是一个数组,所以我做del streams[index]。它没有用,所以我也尝试手动调用垃圾收集器:gc.collect(),没有效果。

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

感谢任何提示/技巧/答案。

干杯!

1 个答案:

答案 0 :(得分:1)

gc.collect将内存标记为未使用。由于您的程序需要更多内存,因此应该重用该内存。但是,它可能无法将该内存释放回操作系统,因此操作系统将继续报告所使用的内存。一般来说,python进程往往会保留它们的内存并且不会将其释放回来,因此它们的总内存占用量将代表“高水位”标记'他们的记忆用法。

在你的情况下,这应该没问题,因为你正在发布流。如果你开始使用另一个流,它应该重复使用相同的空间和你的顶部'报告不应显示规模增加。

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