用于存储键值对的轻量级数据库类库

时间:2011-10-07 16:24:51

标签: java database hashmap

将字符串的键值对存储在Java中的文件的最佳方法是什么,它是可伸缩的(可以使用大量的对,即在访问时不读取或写入整个文件),但是尽可能轻量化?

我问这个问题是因为即使是最轻的数据库库,比如SQLite和H2,对于这个目的来说就像是一种过度杀伤,甚至不可能用于ME程序(尽管我现在主要需要这个程序用于SE程序)。 / p>

5 个答案:

答案 0 :(得分:0)

有一些好主意 in this SO answer。我自己的倾向是使用noSQL或类似的,而讨论更多地集中在hashmap上。我相信,要么会这样做。

答案 1 :(得分:0)

对于一组静态的键值对,我想到了Dan Bernstein的cdb。引用cdb描述:

  

cdb是一个快速,可靠,简单的包,用于创建和读取常量数据库。它的数据库结构提供了几个功能:

     
      
  • 快速查找:在大型数据库中成功查找通常只需要两次磁盘访问。不成功的查找只需要一个。
  •   
  • 低开销:数据库使用2048个字节,每个记录加24个字节,加上密钥和数据的空间。
  •   
  • 没有随机限制:cdb可以处理高达4千兆字节的任何数据库。没有其他限制;记录甚至不必适合记忆。数据库以与机器无关的格式存储。
  •   
  • 快速原子数据库替换:cdbmake可以比其他散列包重写整个数据库两个数量级。
  •   
  • 快速数据库转储:cdbdump以cdbmake兼容格式打印数据库的内容。
  •   
     

cdb旨在用于电子邮件等关键任务应用程序。数据库替换可以安全地防止系统崩溃。读者在重写时不必暂停。

似乎http://www.strangegizmo.com/products/sg-cdb/有一个带有BSD许可证的Java实现。

答案 2 :(得分:0)

明显的初步想法是使用属性,因为它们是流式传输但最终完全加载。您也无法部分读取缓冲集。

考虑到这一点,你可以看到这个额外的其他SO响应。这指的是在流周围导航(尽管不完美),以便您可以重新定位您的阅读:

changing the index positioning in InputStream

使用单独的索引(例如初始字符),您可以智能地重新定位流中的光标。

答案 3 :(得分:0)

Oracle BerkeleyDB java edition允许您存储键值对象,它易于使用和管理,并可向上扩展到天堂(或左右)。 820k并不是那么大。

但是如果你正在考虑缩小到j2me,你可以尝试TinySQL

优点:

  • 小(93k!)
  • 可嵌入
  • 它使用DBF或文本文件文件来存储数据,因此它们很容易 阅读。

缺点:

  • 这是一个古老的未维护项目
  • 它不是设计用于j2me,但由于它可以在JDK 1.1.8中工作,因此在j2me中使它工作并不困难。当然,您必须将一些代码从使用RandomAccessFile更改为FileConnection等等,但至少您不需要弄乱泛型相关代码。
  • 它不是很快,因为它不使用索引,所以你需要尝试看看它是否符合你的需要
  • 它不是功能完整,只是为您提供了一小部分SQL

答案 4 :(得分:0)

Chronicle Map是Java的现代堆外键值存储。如果可以(可选)持久化到磁盘,就像最终一致的数据库一样。纪事地图功能

  • 速度超过1 us的查询,在某些用例中最快可达100 ns(参见comparison with other similar libraries for Java)。
  • 通过分段无共享设计和多级锁定,可以实现多线程甚至进程处理的完美可扩展性,允许多个操作同时访问相同的数据。
  • 每个条目的开销非常低,小于20个字节/条目is achievable