【发布时间】:2018-08-26 04:18:59
【问题描述】:
我正在使用一个神秘的数据收集文件系统。它有一个块描述文件及其在磁盘上的确切偏移量,所以我知道每个文件的起始字节、结束字节和字节长度。目标是从物理磁盘中获取一个文件。它们是大文件,因此性能至关重要。
以下是“有效”的方法,但效率非常低:
import shutil, io
def start_copy(startpos, endpos, filename="C:\\out.bin"):
with open(r"\\.\PhysicalDrive1", 'rb') as src_f:
src_f.seek(startpos)
flength = endpos - startpos
print("Starting copy of "+filename+" ("+str(flength)+"B)")
with open(filename, 'wb') as dst_f:
shutil.copyfileobj( io.BytesIO(src_f.read(flength)), dst_f )
print("Finished copy of "+filename)
这很慢:io.BytesIO(src_f.read(flength)) 在技术上有效,但它会在写入目标文件之前将整个文件读入内存。因此,它需要的时间比应有的要长得多。
直接使用dst_f 复制将不起作用。 (我假设)不能指定结束位置,所以复制不会停止。
这里有一些问题,每个问题都可以解决这个问题:
- 是否有接受开始/结束字节参数的复制库(或适用于 Windows 7 的外部实用程序,可与
subprocess一起使用)? - 是否可以创建
copyfileobj可以使用的类文件对象,该对象仅引用另一个类文件对象的一部分? - 当
io对象搜索超过某个端点时是否会引发异常? - 是否可以强制
copyfileobj在驱动器的给定字节偏移处自然停止(一种“假 EOF”)?
【问题讨论】:
-
为什么需要使用
copyfileobj而不仅仅是write?
标签: python windows filesystems buffer disk