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 に答える