Python 支持零拷贝 I/O 吗?
我有两个打开的文件对象,dest
和 src
。文件对象 dest
打开用于写入,查找位置放置在文件内的某个偏移处,文件对象 src
打开用于读取。我需要做的只是从 src 中的当前位置读取到 EOF 并将内容尽快传输到 dest 。
如果我用 Java 编程,我可以利用 FileChannel#transferTo()
方法执行零复制文件 I/O。
Python也支持零拷贝吗?
I have two open file objects, dest
and src
. File object dest
is opened for writing, with the seek position placed at some offset within the file, and file object src
is opened for reading. What I need to do is simply read from the current position in src
to EOF and transfer the contents to dest
as quickly as possible.
If I were programming in Java, I could utilize the FileChannel#transferTo()
method to perform zero-copy file I/O.
Does Python also support zero-copy?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
从 3.3 版本开始,Python 有了
os.sendfile
,它连接到各种 Unix 变体的sendfile(2)
零拷贝 I/O 接口。它对文件描述符进行操作,而不是一般的类文件对象。对于较旧的 Python,有 py-sendfile。Since version 3.3, Python has
os.sendfile
, which interfaces to various Unix variants'sendfile(2)
zero-copy I/O interfaces. It operates on file descriptors, not general file-like objects. For older Pythons, there's py-sendfile.从 Python 3.8 开始,您可以使用
shutil.copyfile
(以及来自shutil
的其他内容),如果可能的话,它将在内部使用零拷贝,例如os.sendfile
,如果不可能,则回退到简单的读写循环。请参阅shutil文档了解详细信息。
或者问题 33671(shutil.copy* 函数的高效零拷贝(Linux、OSX 和 Win)) 。
以及相应的(合并的)拉取请求。
您可能还对写时复制支持或服务器端复制支持感兴趣。请参阅此处,<一href="https://stackoverflow.com/questions/65492932/ficlone-vs-ficlonerange-vs-copy-file-range-for-copy-on-write-support">此处。
os.copy_file_range
(自 Python 3.8 起)就可以做到这一点。请参阅问题37159(在shutil.copyfile()中使用copy_file_range())(可能是Python 3.9或3.10) 。Since Python 3.8, you can use
shutil.copyfile
(and others fromshutil
) which will internally use zero-copy if possible, such asos.sendfile
, and if not possible, fall back to a simple read-write loop.See the
shutil
docs for details.Or issue 33671 (Efficient zero-copy for shutil.copy* functions (Linux, OSX and Win)).
And the corresponding (merged) pull request.
You might also be interested in copy-on-write support or server-side copy support. See here, here.
The
os.copy_file_range
(since Python 3.8) would do that. See issue 37159 (Use copy_file_range() in shutil.copyfile()) (maybe Python 3.9 or 3.10).