读取多线程的xml文件

时间:2011-06-25 18:21:52

标签: c# multithreading xmltextreader xml

我搜索了很多,但我找不到针对我的问题的propper解决方案。我写了一个包含电视节目的所有剧集信息的xml文件。它是38 kb,包含大约680个变量的属性和字符串。起初我只是在XMLTextReader的帮助下阅读它,它与我的四核一起运行良好。但我的妻子五岁的笔记本电脑花了大约30秒来阅读它。所以我想到了多线程,但是我得到了一个例外,因为文件已经打开了。

线程启动看起来像这样

while (reader.Read())
{
   ...
   else if (reader.NodeType == XmlNodeType.Element)
   {
       if (reader.Name.Equals("Season1"))
       {
           current.seasonNr = 0;
           current.currentSeason = season[0];
           current.reader = reader;
           seasonThread[0].Start(current);
       }
       else if (reader.Name.Equals("Season2"))
       {
           current.seasonNr = 1;
           current.currentSeason = season[1];
           current.reader = reader;
           seasonThread[1].Start(current);
       }

这样的解析方法

reader.Read();

for (episodeNr = 0; episodeNr < tmp.currentSeason.episode.Length; episodeNr++)
{
    reader.MoveToFirstAttribute();
    tmp.currentSeason.episode[episodeNr].id = reader.ReadContentAsInt();
    ...
}

但它不起作用......

我通过了读者,因为我希望'光标'处于正确的位置。但我也不知道这是否可行。

请帮忙!

修改 伙计们我在哪里写过IE?我编写的程序解析了该文件。我在我的电脑和笔记本电脑上运行它。根本没有IE浏览器。

EDIT2: 我做了一些秒表研究,并发现解析xml文件只需要在我的电脑上大约200ms,在我的妻子笔记本电脑上需要800ms。 WPF的播放速度如此之慢?我该怎么办?

4 个答案:

答案 0 :(得分:3)

我同意大多数人的意见。读取38Kb文件不应该花这么长时间。你在机器上运行其他东西,防病毒/等,可能会干扰处理?

创建线程所需的时间远远大于读取文件所花费的时间。如果您可以发布用于读取文件和文件本身的实际代码,则可能有助于分析性能瓶颈。

答案 1 :(得分:1)

我认为你不能在多个线程中解析XML,至少不能以带来性能优势的方式解析XML,因为要从文件中的某个点读取,你需要知道它之前的所有内容,如果没有别的话,要知道你是什么级别。

你的代码,如果有效,会做类似的事情:

main  season1  season2

read
read
skip   read
skip   read
read
skip             read
skip             read

请注意,要执行“skip”,您需要完全解析XML,这意味着您在主线程上执行的工作量与以前相同。唯一的区别是你在后台线程上做了一些额外的工作。

关于缓慢,只需解析这么小的XML文件应该非常快。如果它很慢,你最有可能做一些缓慢的事情,或者你正在多次解析文件。

答案 2 :(得分:0)

如果我了解您的.xml文件的使用方式,您实际上已经创建了一个.xml数据库。

如果正确,我建议使用索引的.xml文档将Xml分解为不同的.xml文件。我想你可以使用Linq-2-Xml查询来自特定.xml源的一组.xml数据。

当然,这意味着您仍然需要加载.xml文件;但是,您将加载非常小的文件,尽管非常不鼓励,您仍可以异步加载.xml文档对象。

答案 3 :(得分:0)

您的XML模式不适用于并行性,因为您似乎具有包含相同数据但必须单独解析的节点名称(Season1,Season2)。您可以重新设计模式以具有相同的节点名称(即Season)和表示数据差异的属性(即Number以指示季节数)。然后你可以并行化,即使用Linq到XML和PLinq:

XDocument doc = XDocument.Load(@"TVShowSeasons.xml");
var seasonData = doc.Descendants("Season")
                    .AsParallel()
                    .Select(x => new Season()
                    {
                        Number = (int)x.Attribute("Number"),
                        Descripton = x.Value
                    }).ToList();