0

我正在从 gphoto2 中检索 JPEG,从数据中创建 Gio 流,然后从流中创建 Pixbuf:

import gphoto2 as gp
from gi.repository import Gio, GdkPixbuf
camera = gp.Camera()
context = gp.Context
camera.init(context)
file = gp.CameraFile()
camera.capture_preview(file, context)
data = memoryview(file.get_data_and_size())
stream = Gio.MemoryInputStream.new_from_data(data)
pixbuf = GtkPixbuf.Pixbuf.new_from_stream(stream)
# display pixbuf in GtkImage

执行此操作的函数使用 . 附加到 Gtk 空闲事件GLib.idle_add(...)。它可以工作,但它会泄漏内存。进程的内存使用不断攀升。即使在构造 pixbuf 的行被注释掉时也会泄漏,但在构造流的行也被注释掉时不会泄漏,因此似乎是流本身正在泄漏。在构建 pixbuf 后添加stream.close()没有帮助。

这里释放内存的正确方法是什么?

4

1 回答 1

2

我不会将其称为这样的答案,如果有人知道该问题的直接答案,我很乐意将其标记为正确答案,但对于处于同一位置的其他人来说,这是一种解决方法:

import gphoto2 as gp
from gi.repository import Gio, GdkPixbuf
camera = gp.Camera()
context = gp.Context
camera.init(context)
file = gp.CameraFile()
camera.capture_preview(file, context)
data = memoryview(file.get_data_and_size())
loader = GdkPixbuf.PixbufLoader.new()
loader.write(data)
pixbuf = loader.get_pixbuf()
# use the pixbuf
loader.close()

这不再泄漏内存。

于 2015-05-11T12:01:58.213 回答