Несколько потоков, читающих из одного и того же файла

У меня есть файл xml, который нужно читать много раз. Я пытаюсь использовать Parallel.ForEach, чтобы ускорить этот процесс, поскольку ни один из этих считываемых данных не имеет отношения к тому, в каком порядке они читаются. Данные просто используются для заполнения объектов. Моя проблема в том, что даже если я открываю файл каждый раз в потоке, поскольку он только для чтения, он жалуется, что он открыт другой программой. (Я не открывал его в текстовом редакторе или еще где-нибудь :))

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

РЕДАКТИРОВАТЬ: Размер файла ~ 18 КБ довольно мал. Его читают около 1800 раз.

Спасибо

14
задан Pieces 20 August 2010 в 00:28
поделиться

3 ответа

Если вы хотите, чтобы несколько потоков читали один и тот же файл, вам нужно указать FileShare.Read :

using (var stream = File.Open("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    ...
}

Однако вы не добьетесь ускорения от этого по нескольким причинам:

  1. Ваш жесткий диск может читать только одну вещь за раз. Хотя у вас одновременно работает несколько потоков, все эти потоки в конечном итоге будут ждать друг друга.
  2. Вы не можете легко проанализировать часть XML-файла. Обычно вам придется каждый раз разбирать весь XML-файл. Поскольку у вас есть несколько потоков, которые все время читают его, кажется, что вы не ожидаете, что файл изменится. Если это так, то зачем вам читать его несколько раз?
32
ответ дан 1 December 2019 в 07:18
поделиться

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

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

Общая предпосылка заключается в том, чтобы загрузить файл один раз в одном потоке, а затем либо напрямую (через структуру Xml), либо косвенно (через XmlNodes и т. Д.) Предоставить доступ к файлу каждому из ваших потоков. Я представляю себе нечто подобное:

  1. Загрузить файл
  2. Для каждого запроса Xpath отправьте соответствующие узлы в ваши потоки.

Если потоки не изменяют XML напрямую, это может быть жизнеспособной альтернативой.

3
ответ дан 1 December 2019 в 07:18
поделиться

При открытии файла необходимо указать FileShare.Read :

using (var stream = new FileStream("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    ...
}

Таким образом, файл можно будет открывать несколько раз для чтения

2
ответ дан 1 December 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: