2017-08-23 13 views
0

Windows 7でPython 3.4を実行すると、Gio.MemoryInputStreamの終了機能はメモリを解放しません。テストコードは、次のとおりGio.MemoryInputStreamは、閉じたときにメモリを解放しません。

from gi.repository import Gio 
import os, psutil 

process = psutil.Process(os.getpid()) 

for i in range (1,10) : 
    input_stream = Gio.MemoryInputStream.new_from_data(b"x" * 10**7) 
    x = input_stream.close_async(2) 
    y = int(process.memory_info().rss/10**6) # Get the size of memory used by the program 
    print (x, y) 

この戻り:

True 25 
True 35 
True 45 
True 55 
True 65 
True 75 
True 85 
True 95 
True 105 

これはクローズ関数がtrueを返した場合でも、各ループに、メモリ10のMBのプログラム増加で使用することを示しています。 Streamが閉じられたら、どのようにメモリを解放することができますか?

もう1つの良い解決策は、ストリームを再利用することです。しかし、set_dataまたはreplace_dataは、次のエラーを発生させます。 'データアクセスメソッドはサポートされていません。代わりに、通常のPython属性を使用してください ' いいですが、どのプロパティ?

私はPython 3.4でメモリにストリームが必要です。私はPyPDF2を使ってPdfファイルを作成してから、それをPopplerでプレビューしたいと思います。 Poppler(Has anyone been able to use poppler new_from_data in python?参照)のバグのため、new_from_data関数を使用することはできず、new_from_stream関数を使用したいと考えています。

答えて

1

a bug in GLib’s Python bindingsこれは簡単には修正できません。

代わりにg_memory_input_stream_new_from_bytes()を使用する必要があります。これはメモリの解放方法が異なりますが、同じバグが発生しないようにする必要があります。


は、より詳細には、new_from_data()とバグがGLibの言語バインディングが自動的に設定する必要がnew_from_data()ためのAPI、GDestroyNotifyパラメータをサポートしていないのすべてを公開することを可能にするために使用するintrospection annotations、によって引き起こされます非NULLは、他の引数に渡される割り当てられたメモリを解放する関数です。 gdbの下でスクリプトを実行すると、pygobjectはNULLGDestroyNotifyパラメータに渡します。 dataパラメータのメモリ管理のセマンティクスが、destroyに渡された内容に依存していることを表現する方法が現在存在しないため、それ以上の改善はできません。

0

答えてくれてありがとう、@Philip Withnall。あなたが提案したソリューションをテストしました。他の人の理解を助けるために、ここに私のテストコードがあります:

from gi.repository import Gio, GLib 
import os, psutil 

process = psutil.Process(os.getpid()) 

for i in range (1,10) : 
    input_stream = Gio.MemoryInputStream.new_from_bytes(GLib.Bytes(b"x" * 10**7)) 
    x = input_stream.close() 
    y = int(process.memory_info().rss/10**6) # Get the size of memory used by the program 
    print (x, y) 

yは長くなりません。

関連する問題