readinto()替换?

2024-10-06 11:18:22 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中使用直接方法复制文件通常如下所示:

def copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)

(此代码段来自舒蒂尔.shutpy顺便说一下)。在

不幸的是,在我的特殊用例中(涉及线程和非常大的缓冲区)[Italics part added later]中,这有缺点。首先,它意味着每次调用read()时都会分配一个新的内存块,当buf在下一次迭代中被覆盖时,这个内存被释放,只是为了同样的目的再次分配新内存。这会减慢整个进程,并给主机带来不必要的负载。在

为了避免这种情况,我使用文件.readinto()方法,不幸的是,该方法被记录为已弃用且“不使用”:

^{pr2}$

我的解决方案可行,但也有两个缺点:第一,不使用readinto()。它可能会消失(文档上说)。第二,使用readinto()时,我无法决定要读入缓冲区的字节数buffer.t文件()我无法决定要写多少,因此最后一个块的特殊情况很麻烦(这也是不必要的开销)。在

我看过数组.array.fromfile(),但它不能用于读取“全部存在”(读取,然后抛出eoferor,并且不分发已处理项目的数量)。也不能解决特殊情况下的收尾问题。在

有没有合适的方法来做我想做的事?也许我只是忽略了一个简单的缓冲类或类似的类,它可以满足我的需要。在


Tags: 文件方法内存readobject情况lengthlike
2条回答

This code snippet is from shutil.py

这是一个标准的库模块。为什么不直接用呢?在

First, it means that with each call of read() a new memory chunk is allocated and when buf is overwritten in the next iteration this memory is freed, only to allocate new memory again for the same purpose. This can slow down the whole process and put unnecessary load on the host.

与从磁盘上实际获取一页数据所需的工作量相比,这是微不足道的。在

普通的Python代码不需要这样的调整-但是如果您真的需要所有的性能调整来从Python代码内部读取文件(如,您正在重写您编写的一些服务器coe,并且已经在性能或内存使用方面起作用)我宁愿直接使用ctypes调用操作系统,这样就可以让一个复制执行得尽可能低。在

在您的情况下,简单地将“cp”可执行文件称为一个外部进程甚至可能不那么困难(它将为您充分利用所有操作系统和文件系统级别的优化)。在

相关问题 更多 >