我有一个使用Picamera库的运动检测脚本。我使用PicameraCircularIO流对象,它继承自CircularIO类(仍然是Picamera库中的一个类),它继承了原生Python BytesIO类。
问题是,当记录到循环流中,然后将流的内容写入磁盘时,内存不会被清除。
在流被写入磁盘后,这就是我所做的:
stream.seek(0)
stream.truncate()
我也尝试过调用stream.flush()
和/或关闭流:stream.close()
,但没有帮助。
我还尝试删除对该流的所有引用,以便对其进行垃圾收集(尽管这样做毫无意义,因为通常情况下,将流截断为0大小就可以了…)。该流在一个数组中,所以我做了del streams[index]
。它不起作用,所以我还尝试手动调用垃圾收集器:gc.collect()
,但没有效果。
只有写入流中的字节才被计算在内存中,而不是流大小。因此,例如,如果2125000字节被写入流中,然后我截断它,那么内存中仍然会有2125000字节。
任何提示/技巧/答案都将不胜感激。
干杯!
gc.collect
正在将内存标记为未使用。由于程序需要更多的内存,因此应该重用这些内存。但是,它可能不会将内存释放回操作系统,因此操作系统将继续报告使用的内存。一般来说,python进程往往会保留内存,而不会将其释放回来,因此它们的总内存占用量将代表其内存使用量的"高水位线"。
在您的情况下,这应该是可以的,因为您正在发布流。如果您开始使用另一个流,它应该重用相同的空间,并且您的"顶部"报告不应该显示大小的增加。
有关更详细的解释,请参见在Python中释放内存。