Alf*_*lfe 4 python arrays fromfile
在 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)
Run Code Online (Sandbox Code Playgroud)
(顺便说一下,这段代码来自shutil.py)。
不幸的是,这在我的特殊用例中存在缺陷(涉及线程和非常大的缓冲区)[斜体部分稍后添加]。首先,这意味着每次调用 read() 都会分配一个新的内存块,当 buf 在下一次迭代中被覆盖时,该内存将被释放,只是为了相同的目的再次分配新内存。这会减慢整个过程并给主机带来不必要的负载。
为了避免这种情况,我使用了 file.readinto() 方法,不幸的是,该方法已被记录为已弃用且“请勿使用”:
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
buffer = array.array('c')
buffer.fromstring('-' * length)
while True:
count = fsrc.readinto(buffer)
if count == 0:
break
if count != len(buffer):
fdst.write(buffer.toString()[:count])
else:
buf.tofile(fdst)
Run Code Online (Sandbox Code Playgroud)
我的解决方案有效,但也有两个缺点:首先,不使用 readinto()。它可能会消失(文档说)。其次,使用 readinto() 我无法决定要读入缓冲区的字节数,而使用 buffer.tofile() 我无法决定要写入的字节数,因此最后一个块的特殊情况很麻烦(这也是不必要的)昂贵的)。
我看过 array.array.fromfile(),但它不能用于读取“所有存在的”(读取,然后抛出 EOFError 并且不分发处理项目的数量)。它也不是结束特殊情况问题的解决方案。
有没有合适的方法来做我想做的事情?也许我只是忽略了一个简单的缓冲区类或类似的东西,它可以满足我的需求。
此代码片段来自shutil.py
这是一个标准库模块。为什么不直接使用它?
首先,这意味着每次调用 read() 都会分配一个新的内存块,当 buf 在下一次迭代中被覆盖时,该内存将被释放,只是为了相同的目的再次分配新内存。这会减慢整个过程并给主机带来不必要的负载。
与从磁盘实际抓取一页数据所需的工作相比,这微不足道。