编辑:使用Win10和python 3.5
我有一个函数,它使用mmap从某个偏移量的文件中删除字节:
def delete_bytes(fobj, offset, size):
fobj.seek(0, 2)
filesize = fobj.tell()
move_size = filesize - offset - size
fobj.flush()
file_map = mmap.mmap(fobj.fileno(), filesize)
file_map.move(offset, offset + size, move_size)
file_map.close()
fobj.truncate(filesize - size)
fobj.flush()
Run Code Online (Sandbox Code Playgroud)
它运行速度非常快,但是当我在大量文件上运行它时,内存很快就会填满,我的系统也没有响应.
经过一些实验,我发现move()方法是这里的罪魁祸首,特别是移动的数据量(move_size).正在使用的内存量等于要移动的数据总量mmap.move().如果我有100个文件,每个移动约30 MB,内存充满〜3GB.
为什么移动的数据不是从内存中释放出来的?
我试过的事情没有效果:
gc.collect()的函数结束.我正在将 pyqt5 GUI 移植到 pyside6,但遇到了一个我不明白的问题。
我有两个 QSpinbox,它们控制两个 GUI 参数:一个 Spinbox 控制拆分器的重量,另一个控制 QtableView 中的行高。
这是pyqt5中的代码:
spinbox1.valueChanged.connect(my_splitter.setHandleWidth)
spinbox2.valueChanged.connect(my_view.verticalHeader().setDefaultSectionSize)
Run Code Online (Sandbox Code Playgroud)
在 Pyside6 spinbox1 工作正常,但 spinbox2 没有完成其工作,并且有此警告:
您无法在源自 C++ 的对象上添加动态槽。
将第二行代码修改为:
spinbox2.valueChanged.connect(lambda x: my_view.verticalHeader().setDefaultSectionSize(x))
Run Code Online (Sandbox Code Playgroud)
很高兴找到解决方案,但我还想了解为什么两个连接在 PySide6 中表现不同以及为什么使用 lambda 可以解决问题。
警告消息可能提供了线索,但我不知道动态插槽是什么(快速谷歌对我没有多大帮助)。
编辑: 由于我更改了两件事:Qt5 > QT6 和 pyqt > pyside 我在 4 个 python 包装器(pyqt5、pyqt6、pyside2、pyside6)中查看了这一点,以了解哪些更改导致了问题。我可以看出 pyside 2 和 6 都显示了这种行为,并且 pyqt 都没有