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

C# 在内存中保存大量文本数据的正确策略是什么?System.Runtime.Caching还是自定义类?,c#,wpf,caching,C#,Wpf,Caching,在重构我的代码开始试验之前,我希望社区的智慧能告诉我正确的道路 问题:我有一个WPF程序,它可以对数百个ini文件进行区分。对于差分的性能,我想在内存中保留数百个和其他文件不同的基本文件。我发现,一旦我加载了10-15个文件,每个文件大约有4000行数据,使用自定义类存储这些数据就会导致GUI停止 我正在考虑几种提高绩效的策略: 不要一次在内存中存储超过几个文件,忘记我希望通过将它们保存在内存中来提高解析性能 尝试在BackgroundWorker线程中运行所有基本文件数据。我没有在GUI线程

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

问题:我有一个WPF程序,它可以对数百个ini文件进行区分。对于差分的性能,我想在内存中保留数百个和其他文件不同的基本文件。我发现,一旦我加载了10-15个文件,每个文件大约有4000行数据,使用自定义类存储这些数据就会导致GUI停止

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

  • 不要一次在内存中存储超过几个文件,忘记我希望通过将它们保存在内存中来提高解析性能
  • 尝试在
    BackgroundWorker
    线程中运行所有基本文件数据。我没有在GUI线程上处理这些文件,但可能所有存储的数据都会以某种方式影响它。我在这里猜
  • 使用
    System.Runtime.Caching
    类进行实验

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

假设文本15*4000*100的100个字符行只有6MB,这在现代PC上是一个微不足道的内存量。如果您的GUI即将停止,那么对我来说,这表明虚拟内存正在交换到磁盘中。这对于6MB来说没有意义,所以我要弄清楚它到底占用了多少空间以及原因。很可能是一些小错误,比起重新思考你的整个战略更容易纠正。另一种可能是它与内存消耗无关,而是一个算法问题。

您应该使用它

它的工作原理几乎与ASP.Net缓存类相似,并允许您设置它应该何时清理,哪些应该首先清理等等

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


非常完整。

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

解决此问题的最佳方法是生成单独的线程来执行差异操作,正如您在文章中提到的,您可以使用backgroundworker,也可以使用threadpool生成尽可能多的线程来执行差异操作


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

加载10-15个4000行文档时,应用程序的内存占用是多少?在.net中,它使用的是unicode,我认为char=2字节,因此内存消耗至少是计算大小的两倍,而且内存消耗的大小严格取决于数据类型。@Johnny:说得好。我在考虑磁盘上传统的仅ansi文本文件的大小。即使是12MB也是微不足道的,所以在我们收到OP的回复之前,我们永远不会知道。我改变了使用RichTextBox来获得我想要的性能的策略,基本上只显示可能适合可见屏幕的数据,而不是在RTB中格式化整个文件的颜色。这是一个有趣的学习体验,因为如果你想做任何类型的大型格式化文档,RTB是一个相当糟糕的容器。很抱歉我的回复太晚了。但的确如此。正如我给你的链接明确指出的:“缓存类和MemoryCache类之间的主要区别在于MemoryCache类已被更改,以使其可供非ASP.NET应用程序的.NET Framework应用程序使用”