python - Gio.MemoryInputStream 关​​闭时不释放内存

标签 python gio

在 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

这表明在每个循环中,程序使用的内存增加 10 MB,即使关闭函数返回 True 也是如此。 一旦 Stream 关​​闭,如何释放内存?

另一个好的解决方案是重用流。但是 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 函数。

最佳答案

这是 a bug in GLib’s Python bindings这不能轻易修复。

相反,您应该使用 g_memory_input_stream_new_from_bytes() ,它以不同的方式处理释放内存,不应出现相同的错误。


更详细地说,new_from_data() 的错误是由 introspection annotations 引起的,GLib 使用它来允许语言绑定(bind)自动公开其所有 API,不支持 new_from_data()GDestroyNotify 参数需要设置为非 NULL 函数释放分配给其他参数的内存。在 gdb 下运行脚本显示 pygobject 将 NULL 传递给 GDestroyNotify 参数。它不能做得更好,因为目前没有办法表达 data 参数的内存管理语义取决于传递给 destroy 的内容。

关于python - Gio.MemoryInputStream 关​​闭时不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45838863/

相关文章:

python - 计算允许 R 中的 QWERTY 错误的 Levenshtein 距离

python - 反转 'login',参数 '()' 和关键字参数 '{}' 未找到

python - sklearn StratfiedShuffleSplit

python - 使用 GIO 的异步 HTTP 请求

python - 在 Windows 上使用 Glib 观察套接字将它们置于非阻塞模式

python - 使用元组作为函数的输入

python - 如何使用 Python、BeautifulSoup 和 mechanize 从表中提取 Web 数据

c - bluez 适配器 api StartDiscovery 超时

python - 如何在 GTK(python 3、Gio)应用程序中监听 DBus 信号?

python - 如何在 Rhythmbox 中查询数据