FileStream медленный, быстрый способ чтения читать несколько байтов из многих файлов - PullRequest
2 голосов
/ 08 ноября 2019

Мне нужно прочитать и обработать более 100 миллионов файлов, но мне нужно прочитать только первые 4 байта каждого файла, потому что мне просто нужно прочитать заголовок.
Я уже создал ядро ​​.net 2.2пакет, чтобы обработать их, и я уже использую многопоточность, чтобы максимизировать параллельную обработку, но после всех возможных оптимизаций, которые я имел в виду, это все еще занимает слишком много времени. Поток файла: File.OpenRead (filePath).
Для сравнения File.Exist (filePath) и Director.Exist (dirPath) намного быстрее.
Даже функция Directory.GetFiles (dirPath), которую я ожидалБыть очень медленным, это займет всего 4% от общего времени выполнения.

И еще 15% времени используется для эффективного чтения данных из потока.

Я прочитал из документации, что размер буфера по умолчанию составляет 4096 байт, поэтому сначала попытался уменьшить его до 4 байт. , но я не получил значительного изменения в производительности, но я считаю правильным сохранить 4096, потому что это размер кластера файловой системы.

Том - это сетевой диск, доступ к которому осуществляется по протоколу CIFS, но файлы сохраняютсяна нескольких физических дисках.

Почему так медленно открывается поток? может быть, потому что нужно проверить права пользователя?

Можете ли вы предложить наиболее быстрый подход для доступа ко всем файлам?

1 Ответ

0 голосов
/ 08 ноября 2019

Я думаю, что настало время для моего отказа от многозадачности:

Одна альтернативная задача, которую вы запускаете в цикле, который перемещается по файлам, в значительной степени стандартна. Если не что иное, просто не блокировать основной поток / GUI-поток.

Но многозадачность во всех ее формах - это не волшебная пуля «делай вещи быстрее». Если вы примените его к неправильной проблеме, вы получите код, который более сложен / более подвержен ошибкам, требует больше памяти и, что более важно, медленнее , чем простой последовательный код.

Файл сейчасобработка обычно связана с диском или сетью. Вы получаете только 4 байта, так что я полагаю, что вы не выполняете много работы с CPU для каждого файла. Таким образом, единственной работой процессора здесь будет открытие и закрытие ручек. Я уверен, что это почти ничего, если только вы не используете антик, например, PIO для дисков / сети. То же касается и диска / сети.

Существует несколько незначительных случаев с подключениями через Интернет и ограничениями для каждого подключения, но я сомневаюсь, что они применимы здесь. И, как правило, многозадачность для каждого файла ничего не ускоряет.

...