как улучшить большое количество небольших файлов для чтения и записи скорость или производительность - PullRequest
3 голосов
/ 02 января 2012

Вчера я задал вопрос здесь: как отключить дисковый кеш в c #, вызывать win32 CreateFile api с FILE_FLAG_NO_BUFFERING .

В моем тесте производительности (запись и чтение теста, 1000файлы и общий размер 220M), FILE_FLAG_NO_BUFFERING не может помочь мне улучшить производительность и ниже, чем дисковый кеш .net по умолчанию, так как я пытаюсь изменить FILE_FLAG_NO_BUFFERING на FILE_FLAG_SEQUENTIAL_SCAN, чтобы получить доступ к дисковому кешу .net по умолчанию и немного быстрее.

раньше, я пытаюсь использовать функцию gridfs mongodb вместо файловой системы Windows - не очень хорошо (и мне не нужно использовать распределенную функцию, просто попробуйте).

в моем продукте,Сервер может получать множество файлов меньшего размера (60-100 Кбайт) в секунду через tcp / ip, затем необходимо сохранить его на диск, и третья служба прочитает эти файлы один раз (просто прочитайте один раз и обработайте). Если я использую асинхронный I/ O, может ли помочь мне, может ли получить лучшую скорость и лучший цикл низкого процессора ?.кто-то может дать мне предложение? или я все еще могу использовать класс FileStream?

обновление 1

файл сопоставления памяти может ли удовлетворить мои требованиячто все файлы записывают в один большой файл или более и читают из него?

Ответы [ 2 ]

3 голосов
/ 02 января 2012

Если вашему ПК требуется 5-10 секунд для записи файла размером 100 КБ на диск, значит, у вас либо самый старый, самый медленный ПК в мире, либо ваш код делает что-то очень неэффективное.

Отключение кэширования на дискевероятно, будет только хуже, чем лучше.При наличии дискового кэша ваши записи будут быстрыми, а Windows сделает медленную часть сброса данных на диск позже.Действительно, увеличение буферизации ввода-вывода обычно приводит к значительному улучшению ввода-вывода в целом.

Вы определенно хотите использовать асинхронную запись - это означает, что ваш сервер начинает запись данных, а затем возвращается к ответам своих клиентов.в то время как ОС имеет дело с записью данных на диск в фоновом режиме.

Не должно быть никакой необходимости ставить записи в очередь (поскольку ОС уже сделает это, если включено кэширование диска), но эточто-то, что вы могли бы попробовать, если все остальное не помогло - это могло бы помочь, записывая только один файл за раз, чтобы минимизировать потребность в поиске на диске.

Как правило, для ввода-вывода использование более крупных буферов помогает увеличить пропускную способность,Например, вместо записи каждого отдельного байта в файл в цикле, запишите буфер данных (в идеале весь файл для указанных вами размеров) в одной операции записи.Это минимизирует накладные расходы (вместо вызова функции записи для каждого байта, вы вызываете функцию один раз для всего файла).Я подозреваю, что вы, возможно, делаете что-то подобное, поскольку я знаю, что это единственный способ снизить производительность до уровней, которые вы предлагали получить.

Файлы с отображением в памяти вам не помогут.Они действительно лучше всего подходят для доступа к содержимому огромных файлов.

1 голос
/ 02 января 2012

Одним из значительных и существенных улучшений, в вашем случае, может быть, imo, обработка файлов без сохранения их на диск и после, если вам действительно нужно их сохранить, нажмите на Queue и подтвердите это в другом потоке, сохранив их на диске. Делая это, вы сразу же получите необходимые обработанные данные, не теряя времени на сохранение данных на диске, а также получите файл на диске после, не потеряв вычислительную мощность вашего file processor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...