将大量文本数据保存在内存中的正确策略是什么? System.Runtime.Caching还是自定义类?

时间:2012-01-15 00:27:32

标签: c# wpf caching

在重构我的代码以开始试验之前,我希望社区的智慧可以告诉我正确的道路。

问题:我有一个WPF程序在数百个ini文件上执行差异。为了实现差异,我想保留数百个其他文件在内存中进行区分的基本文件。我发现使用自定义类来存储这些数据,一旦我加载了10-15个文件,每个文件大约有4000行,就会停止我的GUI。

我正在考虑几种提高绩效的策略:

  • 一次不要在内存中存储多个文件而忘记我希望通过将它们保存在内存中来提高解析能力
  • 尝试在BackgroundWorker线程中运行所有基本文件数据。我没有在GUI线程上做这些文件的任何工作,但也许所有存储的数据都会以某种方式影响它。我猜这里。
  • 试用System.Runtime.Caching课程。

在我看来,here on SO提出的问题没有回答这类工作的最佳策略是什么。提前感谢您提供的任何帮助!

3 个答案:

答案 0 :(得分:3)

假设100个字符的文本行15 * 4000 * 100只有6MB,这是现代PC上的一小部分内存。如果您的GUI暂停,那么对我而言,这表明虚拟内存被换入磁盘。只有6MB才有意义,所以我要弄清楚它真正占用了多少以及为什么。如果可能是一些微不足道的错误,比重新思考整个策略更容易解决。另一种可能性是它与内存消耗无关,而是算法问题。

答案 1 :(得分:3)

您应该使用MemoryCache

它与ASP.Net Cache类几乎相似,并允许您设置何时应该清理,应该首先清理等等。

它还允许您根据依赖项或在特定时间之后重新加载项目。已删除回调。

非常完整。

答案 2 :(得分:0)

如果您的应用程序开始挂起,则更像是在GUI过程中进行密集处理,消费者过多地将资源用于GUI线程上的CPU /内存,因此GUI线程无法及时重新绘制UI。

解决它的最好方法是生成单独的线程来执行diff操作,正如你在帖子中提到的,你可以使用backgroundworker,或者你可以使用threadpool生成尽可能多的线程来做diff。

不要认为你需要将文件缓存在内存中,我认为将结果保存到文件中并按需加载文件会更合适。它不应该成为您的应用程序的瓶颈。