Поддерживает ли Python ввод-вывод с нулевым копированием?

У меня есть два открытых файловых объекта, dest и src. Файловый объект dest открывается для записи, при этом позиция поиска размещается по некоторому смещению внутри файла, а файловый объект src открывается для чтения. Что мне нужно сделать, так это просто прочитать текущую позицию в src в EOF и передать содержимое в dest как можно быстрее.

Если бы я программировал на Java, я мог бы использовать FileChannel#transferTo() для выполнения ввода-вывода без копирования файлов.

Поддерживает ли Python нулевое копирование?


person Daniel Trebbien    schedule 17.09.2011    source источник


Ответы (2)


Начиная с версии 3.3, Python имеет os.sendfile, который взаимодействует с различными sendfile(2) интерфейсы ввода-вывода с нулевым копированием вариантов Unix. Он работает с файловыми дескрипторами, а не с общими файлоподобными объектами. Для старых версий Python есть py-sendfile.

person Fred Foo    schedule 17.09.2011

Начиная с Python 3.8, вы можете использовать shutil.copyfile (и другие из shutil), который будет использовать нулевое копирование, если это возможно, например os.sendfile, а если это невозможно, вернуться к простому циклу чтения-записи.

См. 4_ документы. для деталей. Или проблема 33671 (Эффективное нулевое копирование для функций Shutil.copy* (Linux, OSX и Win)) . И соответствующий (объединенный) запрос на включение.

Вас также может заинтересовать поддержка копирования при записи или поддержка копирования на стороне сервера. См. здесь, здесь. Для этого подойдет os.copy_file_range (начиная с Python 3.8). См. ошибку 37159 (используйте copy_file_range() в Shutil.copyfile()) (возможно, Python 3.9 или 3.10) .

person Albert    schedule 29.12.2020