Поддерживает ли Python ввод-вывод с нулевым копированием?
У меня есть два открытых файловых объекта, dest
а также src
, Файловый объект dest
открывается для записи с позицией поиска, размещенной с некоторым смещением в файле, и объектом файла src
открыт для чтения. Что мне нужно сделать, это просто прочитать с текущей позиции в src
в EOF и передать содержимое dest
как можно быстрее.
Если бы я программировал на Java, я мог бы использовать FileChannel#transferTo()
метод для выполнения ввода-вывода файла с нулевым копированием.
Поддерживает ли Python также нулевое копирование?
2 ответа
Начиная с версии 3.3, Python имеет os.sendfile
, который взаимодействует с различными вариантами Unix ' sendfile(2)
интерфейсы ввода / вывода с нулевой копией. Он работает с файловыми дескрипторами, а не с общими файловыми объектами. Для старых питонов есть py-sendfile.
Начиная с Python 3.8 вы можете использоватьshutil.copyfile
(и другие из ), которые будут использовать нулевое копирование, если это возможно, например
os.sendfile
, а если это невозможно, вернуться к простому циклу чтения-записи.
См .
shutil
документы для получения подробной информации. Или проблема 33671 (Эффективное нулевое копирование для функций Shutil.copy* (Linux, OSX и Win)) . И соответствующий (объединенный) запрос на извлечение .
Вас также может заинтересовать поддержка копирования при записи или поддержка копирования на стороне сервера. Смотрите здесь , здесь . os.copy_file_range
(начиная с Python 3.8) сделает это. См. проблему 37159 (используйте copy_file_range() в Shutil.copyfile()) (возможно, Python 3.9 или 3.10).