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

wds*_*wds 5 java persistence data-structures

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

这可以很容易地实现为简单的sql,但是有一些问题,即我需要尽可能地在磁盘上压缩这个结构的大小.(因为我正在存储的值的数量)另外,它不是事务性的,我只需要编写一次并简单地读取整个表的内容,因此关系数据库实际上不是很合适.

我想知道是否有人有任何好的建议?出于某种原因,我似乎无法想出一些体面的atm.特别是在java中使用API​​的东西会很好.

Gus*_*uss 3

这听起来像是一份工作...... new ObjectOutputStream(new FileOutputStream(STORAGE_DIR + "/" + key + ".dat");

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

在一个像样的文件系统上,写入可以是原子的(通过写入临时文件,然后重命名该文件);读/写速度以 10 兆比特/秒为单位;通过创建一个简单的目录树可以使查找变得非常高效,这样的目录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。它使用一个简单的界面(这远非干净 - 它只是概念的演示),提供了从具有设定最大大小的缓存中存储和检索对象的方法。缓存未命中将转移到用户实现进行处理,缓存将定期检查它是否超出存储要求并删除旧数据。

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

您可以随意使用它。