我正在运行一些动态编程代码(尝试暴力反驳Collatz猜想= P)并且我使用dict来存储我已经计算过的链的长度.显然,它在某些时候耗尽了内存.是否有任何简单的方法可以使用某些变体,dict当它用完房间时会将部分内容分页到磁盘上?显然它会比内存中的字典慢,并且最终可能会占用我的硬盘空间,但这可能适用于其他不那么无用的问题.
我意识到基于磁盘的字典几乎就是一个数据库,所以我使用sqlite3手动实现了一个,但是我并没有以任何智能的方式实现它并让它一次查找数据库中的每个元素...它慢了300倍.
是最聪明的方法来创建我自己的一组dicts,一次只保留一个内存,并以一种有效的方式将它们分页?
我正在寻找一种用于缓存大量数据的解决方案.
相关问题,但针对不同语言:
关于不同术语的问题:
我不需要(或者想要支付任何费用)持久性,事务,线程安全等,并且想要使用比List <>或Dictionary <>更复杂的东西.
如果我必须编写代码,我将把所有内容保存为临时目录中的文件:
string Get(int i)
{
File.ReadAllText(Path.Combine(root,i.ToString());
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,索引将是一个int(并且它们应该是连续的或足够接近的)并且数据将是一个string所以我可以放弃对待两个POD并且宁愿超光并且做到这一点.
用法是我有一系列3k文件(如文件#1到#3000),总计650MB,需要为序列中的每一步做差异.我希望总数大约相同或更多,我不想将所有内容保留在内存中(更大的情况可能会出现在我无法实现的地方).
很多人为我的问题提出了不同的解决方案.然而似乎没有人针对我的小利基.我正在考虑磁盘备份缓存的原因是因为我预计我当前的使用将耗尽我可用地址空间的1/3到1/2.我担心较大的案件会耗尽空间.我并不担心踩踏,持久或复制.我正在寻找的是使用最少代码,最小使用占用空间,最小内存开销和最小复杂性的最小解决方案.
我开始认为我过于乐观了.
是否有基于文件系统的键值存储的高效Java实现,具有以下功能:
Will Berkeley DB JE会吗?
我需要存储一个大的哈希集,能够包含多达大约2亿个40位值.将其存储为2亿64位值是可以接受的(尽管有2亿*16位丢失).
要求是:
微小的内存占用(磁盘空间不是问题,内存是)
快速contains(long l)和add(long l)方法(比SQL快得多)
嵌入式
免费且没有讨厌的许可(没有Berkeley DB).LGPL很好.
没有误报,也没有假阴性,所以像基于磁盘的布隆过滤器这样的东西不是我追求的
SQL 不是我追求的.
因为我真的觉得我的东西后更快速的像这样的(注意解决方案如何比SQL解决方案快得多):
Google有这样的Java API吗?
基于磁盘的快速键/值对实现我只使用"密钥"工作吗?
或者是其他东西?
我宁愿不重新发明.
disk-based ×4
java ×2
c# ×1
caching ×1
database ×1
dictionary ×1
hashset ×1
key-value ×1
python ×1
storage ×1