Вопрос или проблема
Я заметил и протестировал.
Если я передаю файлы, такие как .pdf, .mp4 и т. д. того же размера, что и .py или .pyc, скорость для первых будет около 400 Мбит/с, а для последних — около 2 Мбит/с?
Я даже протестировал на папке с файлами различных типов. Передача неродственных Python файлов всегда была быстрой, но как только она начинала касаться файлов Python, скорость немедленно падала до едва 95% от первоначальной скорости.
Ссылка на изображение: https://i.sstatic.net/a4vRM.jpg
Хотя в вопросе это не уточняется, проблема, вероятно, связана с тем, что данные не кэшируются и вместо этого синхронизируются при копировании на съемное или сетевое устройство. Это нормальное поведение из-за накладных расходов на не кэшированные данные и синхронизированные передачи на такие устройства. Также может быть медленнее даже на другой локальный диск из-за накладных расходов API и файловой системы, которые возникают для каждого отдельного файла. Проблема в том, что когда каждый файл передается индивидуально, а не параллельно, эта проблема проявляется более явно.
Смотрите здесь:
https://superuser.com/a/1448143/373021
Проблема не в том, что это файлы Python, а в том, что они маленькие файлы, возможно, даже на фрагментированном устройстве, если это магнитный диск.
Вы можете проверить это, переименовав файлы во что-то другое, чем .py, и вы увидите тот же результат. Вы заметите, что, хотя копирование файлов .mp4 происходит гораздо быстрее, переименование файлов .py в .mp4 не ускоряет передачу. Это происходит потому, что типичные видео .mp4 — это большие непрерывные файлы, которые не страдают от ни одной из упомянутых выше проблем.
Вот что происходит за кулисами:
Вы копируете 6430 файлов, и через некоторое время скорость копирования замедляется.
Поскольку в этот момент копируются файлы Python, естественное
заключение — это то, что файлы Python медленно копируются.
Возможно, проблема связана с вашим антивирусом, который настаивает
на проверке файлов по одному, но это немного менее вероятно.
Я полагаю, что это поведение связано с тем, что на самом деле вы видите,
как быстро заполняются кэши в Windows и в целевом устройстве
(если это не тот же компьютер).
Windows начнет с чтения с диска на своей скорости
для копирования на целевое устройство с меньшей скоростью.
На этом этапе скорость, которую вы видите, в основном равна скорости
чтения с диска.
Когда память кэша Windows заполняется, скорость упадет до скорости
записи на целевое устройство, так как память кэша нужно освободить, чтобы
читать больше с диска.
Скорость затем снижается до скорости записи, которая всегда меньше,
чем скорость чтения, особенно для мелких файлов.
Кроме того, вы используете Проводник для копирования, что является одним из
самых медленных продуктов, которые я знаю в этой области.
Просто заархивируйте папку с Python, нет необходимости в сжатии. Скопируйте newly_made.tar в новое место. Извлеките по месту копирования и удалите tar.
Ответ или решение
Причины снижения скорости передачи файлов, связанных с Python, на SSD
Передача файлов на твердотельные накопители (SSD) обычно осуществляется с высокой скоростью. Однако в случае передачи небольших файлов, таких как .py или .pyc, вы можете заметить резкое снижение скорости по сравнению с передачей файлов другого типа, например, .pdf или .mp4. Давайте рассмотрим возможные причины такого поведения.
1. Размер и количество файлов
Одной из главных причин низкой скорости передачи является размер передаваемых файлов. Python-файлы (.py и .pyc) обычно маленькие и имеют небольшой объём данных. Когда выделяется значительное количество времени на обработку множества мелких файлов, это может привести к значительным затратам на операции ввода-вывода (I/O).
Применение большого количества небольших файлов создает накладные расходы на файловую систему. Каждый файл требует наложения метаданных, обработки и записи, что значительно затрудняет процесс по сравнению с передачей одного большого файла.
2. Кэширование данных
При передаче файлов операционная система использует кэш. В начале процесса передачи кэш заполняется, что позволяет осуществлять высокоскоростной трансфер. Однако, когда кэш заполняется, скорость передачи начинает зависеть от скорости записи на целевое устройство, что обычно ниже, чем скорость чтения с оригинального устройства. После заполнения кэша требуется освободить память, чтобы продолжать считывание данных, что и приводит к падению скорости.
3. Фрагментация и производительность SSD
Хотя SSD значительно уменьшает проблему фрагментации, неподходящие алгоритмы работы с файлами и общая производительность накопителя всё равно могут оказать влияние на скорость передач. Если файлы находятся в разных областях памяти, на передачу может потребоваться больше времени.
4. Операционная система и файловая система
Использование таких файловых менеджеров, как Windows Explorer, может значительно замедлить процесс. Windows Explorer обрабатывает файлы последовательно и с накладными расходами при каждом обращении к файлам. Альтернативные инструменты, такие как командная строка или более эффективные файловые менеджеры, могут обеспечить лучшую скорость передачи, особенно при работе с большими количествами малых файлов.
5. Антивирусное программное обеспечение
Некоторые антивирусные решения могут проверять каждый файл при его передаче, что также значительно замедляет процесс. Это может быть одной из причин, по которой вы наблюдаете снижение скорости при работе с файлами определённого типа.
Решения
Чтобы ускорить процесс передачи множества Python-файлов, рекомендуется:
- Архивирование: Упакуйте свою папку с файлами в архив (.tar или .zip) перед передачей. Это позволит вам передать один большой файл вместо множества маленьких, снизив накладные расходы на I/O.
- Использование альтернативных утилит: Применяйте командные утилиты, такие как
robocopy
илиxcopy
, которые часто работают быстрее, чем графические интерфейсы. - Оптимизация антивирусных проверок: Если возможно, добавьте временное разрешение на условный пропуск проверки для передачи файлов.
В заключение, причина разной скорости передачи зависит не только от типа файлов, но и от их размера, обработки системой и её конфигурации. Правильный подход к передаче данных поможет вам решить проблему и значительно повысить производительность.