如何让我的程序更具响应性? (加载至少200个文件的程序) - 我可能有1个想法

时间:2010-12-29 16:21:50

标签: c# database file filestream

首先 - 我想对我的屠杀英语说抱歉。

我正在构建一个使用大量文件的程序。我有很多foreach循环遍历硬盘和那些文件(至少200个文件 - 平均每个文件600个字节),循环使用XPath来搜索文件中的值(文件当然是XML文件)< / p>

我需要找到一种方法来使我的程序更具响应性 - 我想到的是以下内容: 计算机内存的加载速度比计算机硬盘更快 - 我认为 - 也许我应该将这些文件加载​​到内存中而不是循环内存而不是循环硬盘..顺便说一句,如果有人可以告诉我多快的计算机记忆是(来自硬盘)而非感谢

先谢谢了.. 嚣

如果有人不理解我的英语,我会再次尝试解释

5 个答案:

答案 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)。