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

C# 如何使我的程序更具响应性?(加载至少200个文件的程序)-我可能有一个想法,c#,database,file,filestream,C#,Database,File,Filestream,首先,我想为我糟糕的英语说声抱歉 我正在构建一个使用大量文件的程序。我有很多foreach循环,循环通过硬盘,这些文件至少有200个文件-每个文件平均600字节,循环使用XPath搜索文件中的值文件当然是XML文件 我需要找到一种方法使我的程序更具响应性——我想到了以下一种方法: 计算机内存的加载速度比计算机硬盘快-我想-也许我应该将这些文件加载到内存中,然后循环内存而不是循环硬盘..顺便说一句,如果有人能告诉我计算机的硬盘内存比感谢快多少 提前谢谢。。 喧闹 如果有人不懂我的英语,我将再次解释

首先,我想为我糟糕的英语说声抱歉

我正在构建一个使用大量文件的程序。我有很多foreach循环,循环通过硬盘,这些文件至少有200个文件-每个文件平均600字节,循环使用XPath搜索文件中的值文件当然是XML文件

我需要找到一种方法使我的程序更具响应性——我想到了以下一种方法: 计算机内存的加载速度比计算机硬盘快-我想-也许我应该将这些文件加载到内存中,然后循环内存而不是循环硬盘..顺便说一句,如果有人能告诉我计算机的硬盘内存比感谢快多少

提前谢谢。。 喧闹


如果有人不懂我的英语,我将再次解释。

您应该在不同的线程中解析XML文件,并创建包含所需信息的对象,这样您就可以即时访问信息。

定义响应。您的意思是希望UI提示继续发生,还是希望在UI处理文件时继续能够在UI中执行其他操作

前者很简单,您只需在循环中偶尔添加Application.DoEvents即可。这将提示UI执行任何正在等待的提示,如绘制窗口等


后者将涉及多线程。深入研究这一点比一两段文字要复杂一些,但是一些谷歌搜索c.net多线程教程应该会得到大量的结果。如果您不熟悉多线程提供的基本概念,我可以进一步解释。

您可以使用数据库存储XML文件,它将比您当前的模式更快、更安全、更可靠。您可以构建索引,启用并发访问,支持XQuery/Xpath以及更多优点


如果您只有XML文件,您可以考虑本机XML数据库,或者如果您还有其他类型的话,可以考虑像Oracle或DB2这样的支持XML的DBML.< /P> < P>使用后台工作人员或线程池生成I/O的多个线程,然后将数据读入队列这是假设数据的总大小不太大。让另一个线程读取该队列,并执行内部xPath逻辑从这些文件中提取所需的内容

本质上,可以将其视为的一个实例,其中I/O读取器线程是生产者,XPath逻辑线程是消费者


队列中对象的类型可能只是一个字节数组,但我建议使用一个自定义的C类,该类包含字节数组以及一些文件元数据,以防出于任何原因需要它。

我认为最好的方法是。将这些XML文件分组,并使用LINQ to XML并行查询它们。下面是一个简单的示例,它加载C:\xmlFolder中的所有xml文件,并选择包含名称为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(); 

你的意思是“响应”还是“更快”?@Marcel我猜OP是因为语言障碍而以相同的方式查看它们…虽然我知道响应可能表示在UI线程上完成了工作…更快是分析数据的速度…公平的问题…如果你走这条路线,请确保将不再需要的东西处理为所有内存中的数据是不需要的,如果文件大小增加会导致问题…600个文件*1Kbyte=600Kbytes,因此目前和中期无需这样做。这是最佳做法…保留不需要的内容没有价值,也不允许任何内容进行缩放…嗯。。。最好的做法是处理不需要的内容,但这与常识有关,与这个问题无关。-1建议使用DB w/o,不知道程序在做什么,为什么等,但知道有120K的数据。他说的是200-600个文件,并查询所有文件。正确调优数据库后,所有查询都将比您的任何优秀的非db想法快得多。等待你更好更快的想法,如果你有。他没有200-600个文件-请再次阅读问题。我不会优化我不懂的东西。一切都使用DB是一个非常糟糕的主意。例如,如果这是一个批处理类型的解析,那么使用数据库是没有意义的。@Aaron:这一点很好。我想我假设WinForms没有被明确告知任何一种方式。当我指的是响应式时,我指的是我的程序中有一个文本编辑器,当用户输入某个内容时,程序会在文件中循环,通过循环这些文件,光标会提示一秒,然后再次显示,这是因为程序在文件中循环,这会使计算机停留一秒-我的cpu使用率在一段时间内提高20%sec@dinbrca:听起来像是在处理UI提示
因此,线程只是偶尔等待较重的处理步骤。那么你肯定想把这些步骤转移到单独的线程上。@David:那么,你的意思是我应该使用线程?我可以有一个好的链接到一个好的教程。此外-我不应该也将文件加载到内存中,并在不再需要它们时将其删除,这将使处理速度更快,因为文件的访问速度更快,不是吗?@dinbrca:如果不再需要这些文件,你一定要尽快释放这些资源,始终如此。至于加载到内存中,这基本上应该已经发生了,除非您以我不熟悉的方式加载文件。至于一个好的教程,有很多。我个人不知道哪一个优于其他人。但从微软的产品开始可能是安全的: