多个线程从同一个文件读取

时间:2010-08-19 23:56:24

标签: c# xml file foreach parallel-processing

我有一个需要多次读取的xml文件。我正在尝试使用Parallel.ForEach来加速这个过程,因为没有读入的数据与它正在读入的顺序有关。数据只是用于填充对象。我的问题是即使我每次在线程中打开文件只读它抱怨它是由另一个程序打开。 (我没有在文本编辑器中打开它或任何东西:))

如何从同一个文件中完成多次读取?

编辑:文件大约是18KB。它读取大约1800次。

由于

4 个答案:

答案 0 :(得分:31)

如果您希望多个线程从同一个文件中读取,则需要指定FileShare.Read

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

但是,由于多种原因,您无法实现任何加速:

  1. 您的硬盘一次只能读取一件事。虽然你有多个线程同时运行,但这些线程最终都会等待彼此。
  2. 您无法轻松解析XML文件的一部分。您通常每次都必须解析整个XML文件。由于您有多个线程一直在读取它,因此您似乎不希望文件发生更改。如果是这种情况,那你为什么需要多次阅读呢?

答案 1 :(得分:3)

根据文件的大小和您正在执行的读取类型,首先将文件加载到内存中,然后直接向线程提供访问权限可能会更快。

您没有提供有关文件,读取等的任何细节,因此我无法确定它是否能满足您的特定需求。

一般的前提是在单个线程中加载文件一次,然后直接(通过Xml结构)或间接(通过XmlNodes等)提供对每个线程的文件的访问。我设想了类似的东西:

  1. 加载文件
  2. 对于每个Xpath查询,将匹配的节点分配给您的线程。
  3. 如果线程不直接修改XML,这可能是一个可行的选择。

答案 2 :(得分:1)

打开文件时,需要指定FileShare.Read

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

这样可以多次打开文件进行阅读

答案 3 :(得分:-1)

虽然是旧帖子,但它似乎很受欢迎,所以我想我会添加一个解决方案,该解决方案用于需要对文件进行读取访问的多线程环境。但是,该文件必须足够小以至少在您的处理期间保存在内存中,并且该文件只能在共享访问期间读取而不能写入。

string FileName = "TextFile.txt";
string[] FileContents = File.ReadAllLines(FileName);

foreach (string strOneLine in FileContents)
{
  // Do work on each line of the file here
}

只要文件只是被读取,多个线程或程序就可以同时访问和处理它,而不会相互影响。