如何从内存中删除流?
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。
我有一个使用 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。