在内存中保存大量文本数据的正确策略是什么?System.Runtime.Caching或自定义类
本文关键字:System 是什么 策略 Runtime Caching 自定义 保存 内存 数据 文本 | 更新日期: 2023-09-27 18:20:23
在重构代码开始实验之前,我希望社区的智慧能为我提供正确的路径建议。
问题:我有一个WPF程序,它对数百个ini文件进行了差异处理。为了执行困难,我想在内存中保留几百个其他文件不同的基本文件。我发现,一旦我加载了10-15个文件,每个文件大约有4000行数据,使用自定义类来存储这些数据就会使我的GUI停止。
我正在考虑几种提高性能的策略:
- 不要一次在内存中存储多个文件,忘记我希望通过将它们保存在内存中来提高解析性能
- 尝试在
BackgroundWorker
线程中运行所有基本文件数据。我没有在GUI线程上处理这些文件,但可能所有存储的数据都会以某种方式影响它。我猜在这里 - 用
System.Runtime.Caching
类进行实验
在我看来,SO上提出的问题并没有回答这类工作的最佳策略是什么的问题。提前感谢您提供的任何帮助!
假设100个字符的文本行15*4000*100只有6MB,这在现代电脑上是一个微不足道的内存量。如果你的GUI即将停止,那么对我来说,这表明虚拟内存正在交换到磁盘。这对于6MB来说是没有意义的,所以我会弄清楚它到底占用了多少以及为什么。如果很可能是一些微不足道的错误,那么修复起来比重新思考整个策略更容易。另一种可能性是,它与内存消耗无关,而是算法问题。
您应该使用MemoryCache
。
它的工作原理几乎与ASP.NetCache类类似,并允许您设置何时应该清理,哪些应该首先清理等等。
它还允许您根据依赖关系或在某个时间后重新加载项目。在remove上具有回调。
非常完整。
如果你的应用程序开始挂起,它更像是在你的GUI进程中进行密集的进程,这会消耗你的GUI线程上太多的CPU/Memory资源,因此GUI线程无法及时重新绘制你的UI。
解决这个问题的最好方法是生成单独的线程来执行diff操作,正如您在文章中提到的,您可以使用backgroundworker,也可以使用线程池来生成尽可能多的线程来进行diff操作。
不要认为你需要将文件缓存在内存中,我认为将结果保存到文件中,并根据需要加载文件会更合适。它不应该成为应用程序的瓶颈。