4

我进行了很多搜索,但找不到适合我的问题的解决方案。我编写了一个包含电视节目所有剧集信息的 xml 文件。它是 38 kb,包含大约 680 个变量的属性和字符串。起初我只是在 XMLTextReader 的帮助下阅读它,它在我的四核上运行良好。但是我妻子用了 5 年的笔记本电脑花了大约 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 的文章??我编写的程序解析文件。我在我的 PC 和笔记本电脑上运行它。根本没有IE。

EDIT2: 我做了一些秒表研究,发现解析 xml 文件在我的 PC 上只需要大约 200 毫秒,在我妻子的笔记本电脑上只需要 800 毫秒。是WPF这么慢吗?我能做些什么?

4

4 回答 4

3

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

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

于 2011-06-25T19:21:39.650 回答
1

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

你的代码,如果 tit 工作,会做这样的事情:

main  season1  season2

read
read
skip   read
skip   read
read
skip             read
skip             read

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

关于慢,仅仅解析这么小的XML文件应该很快。如果它很慢,你很可能在做其他很慢的事情,或者你正在多次解析文件。

于 2011-06-25T18:42:22.040 回答
0

您的 XML 模式不适合并行性,因为您似乎具有包含相同数据但必须单独解析的节点名称(Season1、Season2)。您可以重新设计您的模式以具有相同的节点名称(即Season)和表示数据差异的属性(即Number表示季节编号)。然后你可以并行化,即使用 Linq to 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();
于 2011-06-25T18:53:15.170 回答
0

如果我了解您的 .xml 文件是如何被使用的,那么您实际上已经创建了一个 .xml 数据库。

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

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

于 2011-06-25T18:37:51.893 回答