Какой самый быстрый способ записи сотен файлов на диск с помощью C #? - PullRequest
1 голос
/ 10 января 2011

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

Есть ли лучший способ сохранить это количество файлов на диск? Я пришел к решению, но не знаю, лучшее ли оно.

Сначала я создаю 2 файла, один из которых похож на таблицу размещения, а второй - огромный файл, в котором хранится все содержимое моих документов. Но чтение из этого файла было бы кошмаром; может быть, техника файла с отображением в памяти может помочь. Может ли работа с 30 ГБ или более создать проблему?

Редактировать: Какой самый быстрый способ хранения 1000 текстовых файлов на диске? (операция записи выполняется часто)

Ответы [ 3 ]

2 голосов
/ 10 января 2011

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

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

2 голосов
/ 10 января 2011

Первое, что вы должны сделать, это профилировать ваше приложение.В частности, вы хотите получить счетчики вокруг длины очереди диска.Длина вашей очереди должна быть не более чем в 1,5-2 раза больше количества дисков на вашем диске.

Например, если у вас система с одним диском, длина очереди не должна превышать 2. Если у вас RAID-массив с 3 дисками, он должен быть больше 6.

Убедитесь, что вы действительно пишете с привязкой.Если это так, то лучший способ повысить производительность массовых записей - это купить диски с очень высокой производительностью записи.Обратите внимание, что большинство настроек RAID приведут к снижению производительности.

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

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

0 голосов
/ 10 января 2011

Как насчет использования ThreadPool для этого?

т.е. для каждого полученного «файла» поставьте в очередь функцию записи в потоке пула потоков, которая фактически сохраняет данные в файл на диске.

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