Поддерживает ли 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).

Другие вопросы по тегам