首先 - 我想对我的屠杀英语说抱歉。
我正在构建一个使用大量文件的程序。我有很多foreach循环遍历硬盘和那些文件(至少200个文件 - 平均每个文件600个字节),循环使用XPath来搜索文件中的值(文件当然是XML文件)< / p>
我需要找到一种方法来使我的程序更具响应性 - 我想到的是以下内容: 计算机内存的加载速度比计算机硬盘更快 - 我认为 - 也许我应该将这些文件加载到内存中而不是循环内存而不是循环硬盘..顺便说一句,如果有人可以告诉我多快的计算机记忆是(来自硬盘)而非感谢
先谢谢了.. 嚣
如果有人不理解我的英语,我会再次尝试解释
答案 0 :(得分:2)
我认为最好的方法是PLINQ in C#4.0。对这些XML文件进行分组,并使用LINQ-to-XML并行查询它们。以下是一个简单示例,它将所有xml文件加载到C:\ xmlFolder中,并选择包含名称为“key”的元素的文档。
List<XDocument> xmls = Directory.EnumerateFiles(@"C:\XmlFolder").AsParallel()
.Select(path => XDocument.Load(path))
.Where(doc => doc.Descendants()
.Any(ele => ele.Name.Equals("key")))
.ToList();
答案 1 :(得分:0)
您应该在不同的线程中解析XML文件并使用所需信息创建对象,这样您就可以即时访问信息。
答案 2 :(得分:0)
定义“响应”。您是说您希望UI提示继续发生,还是您希望在处理文件时继续在UI中执行其他操作?
前者很简单,你可以在你的循环中偶尔抛出Application.DoEvents()
。这将提示UI执行任何等待的提示(例如绘制窗口等)。
后者将涉及多线程。潜入其中比在一两段中教授要复杂得多,但是一些谷歌搜索“c#.net多线程教程”应该会产生大量的结果。如果您不熟悉多线程提供的基本概念,我可以进一步解释它。
答案 3 :(得分:0)
使用BackgroundWorker或ThreadPool为I / O生成多个线程,然后将数据读入队列(这假设您的数据总大小不是太大)。让另一个线程读取该队列,并使用内部xPath逻辑从这些文件中提取所需的任何内容。
基本上,将其视为Producer/Consumer design pattern的一个实例,其中您的I / O读取器线程是生产者,而您的XPath逻辑线程是消费者。
队列中对象的类型可能只是一个字节数组,但是我建议一个包含字节数组的自定义C#类,以及一些文件元数据,以防万一你因任何原因需要它
答案 4 :(得分:-5)
您可以使用数据库存储XML文件,它比您当前的架构更快,更安全,更可靠。您可以构建索引,启用并发访问,支持XQuery / Xpath以及更多“优点”。
如果您只有XML文件,则可以考虑使用本机XML数据库,或者如果您还有其他类型,则可以考虑使用支持XML的DBMLS(例如Oracle或DB2)。