gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:18 24 4
gpt4 key购买 nike

我需要存储一些数据,这些数据遵循将“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com