Многопоточная запись в файл - PullRequest
3 голосов
/ 07 июля 2010

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

Мой вопрос: какой безопасный способ сделать это?Открываю ли я файл для записи, создаю ли мои потоки, передавая объект Stream каждому потоку?Я не хочу, чтобы произошла ошибка, потому что несколько потоков одновременно обращаются к одному и тому же объекту.

Кстати, это C #.

Ответы [ 3 ]

14 голосов
/ 07 июля 2010

Я бы лично предложил вам извлечь данные в нескольких потоках, но на самом деле записать из одного потока. Вероятно, так будет значительно проще. Вы можете использовать очередь производителя / потребителя (которая действительно проста в .NET 4), и тогда каждый производитель будет выдавать пары "индекс, данные". Затем потребительский поток может просто последовательно искать, писать, искать, писать и т. Д.

1 голос
/ 07 июля 2010

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

1 голос
/ 07 июля 2010

Если бы это было программирование в Linux, я бы порекомендовал вам посмотреть команду pwrite(), которая записывает буфер в файл с заданным смещением.Однако при быстром поиске документации по C # ничего подобного не получается.Кто-нибудь знает, существует ли подобная функция?

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