java - 简单 id 到 java 值映射表的高效持久存储

标签 java data-structures persistence

我需要存储一些数据,这些数据遵循将“id”映射到多列(即一些整数值 [u, v, w])的完整表(具有多行)的简单模式。其中一个表的大小为几 KB。基本上我需要的是存储一些中间结果的持久缓存。

这可以很容易地作为简单的 sql 实现,但是有几个问题,即我需要尽可能地压缩磁盘上这个结构的大小。 (因为我存储的值的数量)而且,它不是事务性的,我只需要写一次并简单地读取整个表的内容,所以关系数据库实际上并不是一个非常合适的选择。

请问大家有什么好的建议吗?出于某种原因,我似乎无法想出一些像样的 atm。尤其是在 Java 中带有 API 的东西会很好。

最佳答案

这听起来像是...... new ObjectOutputStream(new FileOutputStream(STORAGE_DIR + "/"+ key + ".dat"); !!

说真的 - 最简单的方法是为每个要存储的数据表创建一个文件,将数据序列化到其中,并在需要读取时使用键作为文件名进行查找。

在一个体面的文件系统上,写入可以是原子的(通过写入一个临时文件然后重命名该文件);读/写速度以 10 秒的 MBit/秒为单位;通过创建像 STORAGE_DIR + "/"+ key.substring(0,2) + "/"+ key.substring(0,4) + "/"+ key 这样的简单目录树,查找可以变得非常高效 如果您的文件系统使用索引目录,它应该对数百万个条目仍然有效,甚至更有效;最后,在此之上实现内存支持的 LRU 缓存以实现更快的检索是微不足道的。

关于压缩——您可以在存储数据之前使用 Jakarta 的 commons-compress 对数据进行 gzip 甚至 bzip2 压缩。但这是一个优化问题,根据您的应用程序和可用磁盘空间,您最好将 CPU 周期投资于其他地方。

这是我制作的示例实现:http://geek.co.il/articles/geek-storage.zip .它使用一个简单的接口(interface)(这远非干净 - 它只是概念的演示)提供了从具有设置的最大大小的缓存中存储和检索对象的方法。缓存未命中被转移到用户实现进行处理,缓存将定期检查它是否超过存储要求并删除旧数据。

我还包括一个 MySQL 支持的完成实现和一个基准来比较基于磁盘和基于 MySQL 的实现。在我的家用机器(旧的 Athlon 64)上,磁盘基准测试得分比附带的基准测试中的 MySQL 实现快两倍(9.01 秒对 18.17 秒)。尽管可能可以调整数据库实现以获得更好的性能,但我相信它足以很好地说明问题。

您可以随意使用它。

关于java - 简单 id 到 java 值映射表的高效持久存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/639077/

相关文章:

java - 如何使用 Integer.toBinaryString 设置 java 中的位数?

java - 用于随机访问且无重复的正确数据结构

python - 将提取的向量加载到 TfidfVectorizer

java - JSoup BodyAsBytes 连接到 FileOutputStream 以保存临时文件不起作用?

java - Guava 中的 IntervalTree

java.lang.ClassNotFoundException : org. apache.commons.digester.Rule

haskell - 为什么 FingerTrees 的使用不足以实现稳定的实现?

algorithm - 如何使用两个堆栈实现队列?

java - 自动持久化一个复杂的 Java 对象

c# - 为什么隔离存储在我的 WP7 应用程序中没有持久存在?