Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        5年前关闭。
                                                                                            
                
        
我正在寻找即使在Windows窗体应用程序关闭后仍然存在的内存缓存。到目前为止,我考虑过的唯一选择是在关闭应用程序之前,使用二进制格式化程序将内存缓存对象写入文件。

我可以使用NuGet上提供的持久性内存缓存吗?

编辑:
我们在“映射”表中大约有3000万行,每1小时需要查询100,000次。需要缓存的想法是避免使用查询来堆积数据库。

映射表的结构:

Zip code             TimeZoneGMTOffset
---------------------------------------
12345                -6
12346                -5
...


我们将每小时大约解析100,000个配置文件。作为此解析的一部分,我们将针对其邮政编码查询时区偏移量,并使用其来计算时间范围。

最好的方法是什么?

最佳答案

是的,您可以使用PersistentDictionary随附的ManagedEsent。实际上,它是Esent上的托管包装。

Dictionary<K, V>一样容易使用。持久性是在幕后完成的。

您将需要以键值对格式构造要缓存的数据。值也受某些条件的影响。请参阅我链接的页面中的Supported Value Types部分。

功能(从其CodePlex页面):


没有设置:ESENT数据库引擎是Windows的一部分,不需要设置。从XP开始,EsentCollections将可在任何Windows版本上使用。
性能:ESENT支持较高的更新和检索速度。预写日志记录减少了对数据进行小更新的成本。信息将插入到数据库中或从数据库中检索,因此数据访问的开销非常低。 B树通过键为O(log n)提供对数据的访问,并且记录按排序顺序存储。
简单性:PersistentDictionary的外观和行为类似于.NET Dictionary / SortedDictionary / SortedList类。不需要额外的方法调用。
免管理:ESENT自动管理数据库缓存大小,事务日志文件和崩溃恢复,因此不需要数据库管理。代码经过结构化,因此即使多个线程使用同一个字典,也不会出现死锁或冲突。 ESENT在进程内运行,并且不会暴露任何网络访问权限,从而提供高度的安全性。
可靠性:ESENT的预写日志记录系统意味着在进程崩溃或机器意外关闭(例如断电)之后,数据库将自动恢复。数据库事务用于确保数据库的逻辑一致性。
并发:每个数据结构可以由多个线程访问。读取是非阻塞的,并且允许同时进行对集合中不同项目的更新。
规模:一个集合最多可以包含2 ^ 31个对象,并且值的大小最多可以为2GB。最大数据库大小为16TB。

关于c# - Windows应用程序的持久性内存缓存? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25317592/

10-10 13:15