我搜索了很多,但我找不到针对我的问题的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的播放速度如此之慢?我该怎么办?
答案 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();