小编mah*_*tah的帖子

Python,为什么mmap.move()会填满内存?

编辑:使用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()的函数结束.
  • 重写函数以小块移动.

python memory performance mmap

6
推荐指数
1
解决办法
562
查看次数

为什么类似的信号/槽连接在 Pyqt5 到 PySide6 端口后表现不同

我正在将 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 都没有

python qt pyqt5 pyside6

4
推荐指数
1
解决办法
492
查看次数

标签 统计

python ×2

memory ×1

mmap ×1

performance ×1

pyqt5 ×1

pyside6 ×1

qt ×1