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

Pie*_*ces 14 c# xml parallel-processing foreach file

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

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

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

谢谢

Tim*_*mwi 32

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

using (var stream = File.Open("theFile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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


Gra*_*rdx 5

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

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

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

  1. 加载文件
  2. 对于每个 Xpath 查询,将匹配的节点分派到您的线程。

如果线程不直接修改 XML,这可能是一个可行的替代方案。