Python支持零拷贝I / O吗?

时间:2011-09-17 16:23:08

标签: python file-io io zero-copy

我有两个打开的文件对象destsrc。打开文件对象dest进行写入,将搜索位置放在文件中的某个偏移处,打开文件对象src进行读取。我需要做的只是从src中的当前位置读取到EOF,并尽快将内容传输到dest

如果我使用Java编程,我可以使用FileChannel#transferTo()方法执行零拷贝文件I / O.

Python是否也支持零拷贝?

2 个答案:

答案 0 :(得分:7)

从版本3.3开始,Python有os.sendfile,它与各种Unix变种'sendfile(2)零拷贝I / O接口接口。它在文件描述符上运行,而不是一般的文件类对象。对于年龄较大的蟒蛇,有py-sendfile

答案 1 :(得分:0)

从 Python 3.8 开始,您可以使用 shutil.copyfile(以及来自 shutil 的其他),如果可能,它将在内部使用零复制,例如 os.sendfile,如果不可能,则回退到一个简单的读写循环。

有关详细信息,请参阅 the shutil docs。 或issue 33671 (Efficient zero-copy for shutil.copy* functions (Linux, OSX and Win))。 还有the corresponding (merged) pull request

您可能还对写时复制支持或服务器端复制支持感兴趣。见herehereos.copy_file_range(自 Python 3.8 起)可以做到这一点。请参阅 issue 37159 (Use copy_file_range() in shutil.copyfile())(可能是 Python 3.9 或 3.10)。