在 Windows 7 上运行 Python 3.4,Gio.MemoryInputStream 的 close 函数不会释放内存,而它应该释放内存。测试代码是:
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
这表明,在每次循环中,即使 close 函数返回 True,程序使用的内存也会增加 10 MB。
一旦流关闭,如何释放内存?
另一个好的解决方案是重用流。但 set_data 或 Replace_data 会引发以下错误:
'不支持数据访问方法。使用普通的 Python 属性来代替'
很好,但是哪个属性呢?
我需要 Python 3.4 中内存中的流。我使用 PyPDF2 创建一个 Pdf 文件,然后我想使用 Poppler 预览它。由于 Poppler 中的错误(请参阅有人能够在 python 中使用 poppler new_from_data 吗? https://stackoverflow.com/questions/42735374/has-anyone-been-able-to-use-poppler-new-from-data-in-python)我无法使用 new_from_data 函数,并且想使用 new_from_stream 函数。
This is GLib 的 Python 绑定中的一个错误 https://bugzilla.gnome.org/show_bug.cgi?id=747431这是无法轻易修复的。
相反,你应该使用g_memory_input_stream_new_from_bytes() https://developer.gnome.org/gio/stable/GMemoryInputStream.html#g-memory-input-stream-new-from-bytes,它以不同的方式处理释放内存,并且不应该遭受相同的错误。
更详细地说,该错误new_from_data()
是由内省注释 https://wiki.gnome.org/Projects/GObjectIntrospection/Annotations,GLib 使用它来允许语言绑定自动公开其所有 API,不支持GDestroyNotify
参数为new_from_data()
需要设置为非NULL
函数释放分配的内存,并将其传递给其他参数。在下面运行你的脚本gdb
显示 pygobject 通过NULL
to the GDestroyNotify
范围。它不能做得更好,因为目前还没有办法表达内存管理语义data
参数取决于传递给的内容destroy
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)