c#的磁盘支持字典/缓存

时间:2009-01-03 00:37:49

标签: c# caching disk-based

我正在寻找一种用于缓存大量数据的解决方案。

相关问题,但针对不同语言:

以不同的方式提出问题:

我不需要(或者想要支付任何费用)持久性,交易,线程安全等,并且想要使用比List<>更复杂的东西。或字典<>。

如果我必须编写代码,我将把所有内容保存为temp目录中的文件:

string Get(int i)
{
   File.ReadAllText(Path.Combine(root,i.ToString());
}

在我的情况下,索引中的int(并且它们应该连续或足够接近),数据将是string,因此我可以放弃同时处理{{3}而且宁可做超轻,也要做到这一点。

用法是我有一系列3k文件(如文件#1到#3000),共计650MB,需要为序列中的每一步做差异。我希望总数大约相同或更多,我不想把所有内容保留在内存中(更大的情况可能会出现在我无法实现的地方)。


许多人为我的问题提出了不同的解决方案。然而似乎没有人针对我的小利基。我正在考虑磁盘备份缓存的原因是因为我预计我当前的使用将耗尽我可用地址空间的1/3到1/2。我担心较大的案件会耗尽空间。我并不担心踩踏,持久或复制。我正在寻找的是一个最小的解决方案,使用最少的代码,最小的使用占用空间,最小的内存开销和最小的复杂性。

我开始认为我过于乐观了。

10 个答案:

答案 0 :(得分:4)

你真正想要的是B树。 这是数据库使用的主要数据结构。 它旨在使您能够根据需要有效地将数据结构的某些部分与磁盘交换。

我不知道C#的任何广泛使用的高质量独立B-Tree实现。

然而,获得一个的简单方法是使用Sql Compact数据库。 Sql Compact引擎将在进程中运行,因此您不需要运行单独的服务。它会给你一棵b树,但没有头疼。您只需使用SQL来访问数据。

答案 1 :(得分:2)

免责声明 - 我即将为您指出我参与的产品。

我仍然在网站方面工作,所以没有太多的信息,但Serial Killer将非常适合这一点。我有使用.Net序列化(可以提供示例)的示例,因此为.Net可序列化对象编写持久性地图缓存将是微不足道的。

足够无耻的自我推销 - 如果有兴趣,请使用网站上的联系链接。

答案 2 :(得分:2)

这与我的问题非常相似

Looking for a simple standalone persistant dictionary implementation in C#

我不认为一个完全符合您想要的库存,也许是时候在github上开发一个新项目了。

答案 3 :(得分:1)

以下是.net:http://bplusdotnet.sourceforge.net/

的B-Tree实现

答案 4 :(得分:0)

您可以将MS application block与基于磁盘的缓存解决方案

一起使用

答案 5 :(得分:0)

尝试同时查看NCache here

我不隶属于这家公司。我刚下载并测试了他们的免费快递版本。

答案 6 :(得分:0)

我已经将EhCache Java应用程序部分弹出到.NET。分布式缓存尚未实现,但在单个节点上,所有原始UnitTests都会通过。完整的OpenSource:

http://sourceforge.net/projects/thecache/

如果需要,我可以创建一个二进制删除(现在只提供源代码)

答案 7 :(得分:0)

我采用嵌入式数据库路由(SQLite,Firebird),但这里有一些其他选项:

答案 8 :(得分:0)

我推荐MS的企业库中的缓存应用程序块。这也是建议的,但链接指向企业库的数据访问部分的文章。

以下是缓存应用程序块的链接:

http://msdn.microsoft.com/en-us/library/cc309502.aspx

具体而言,您将需要创建一个新的后备存储(如果存在持久存储到磁盘的那个):

http://msdn.microsoft.com/en-us/library/cc309121.aspx

答案 9 :(得分:0)

鉴于您最近对该问题进行了编辑,我建议您实施问题中提到的解决方案,因为您不太可能在库中找到这样一个天真的解决方案供您重复使用。