代码之家  ›  专栏  ›  技术社区  ›  Joel

推荐一个快速且可扩展的持久映射-Java

  •  24
  • Joel  · 技术社区  · 16 年前

    我需要一个磁盘支持的映射结构,以便在Java应用程序中使用。它必须具备以下标准:

    1. 能够存储数百万条记录(甚至数十亿条)
    2. 快速查找-地图上的大多数操作只需查看密钥是否已存在即可。这一点和以上第1点是最重要的标准。对于经常使用的密钥,应该有一个有效的内存缓存机制。
    3. 能够存储简单的基本类型,但我不需要存储序列化对象。
    4. 它不需要分布式,即在一台机器上运行。
    5. 设置简单&免费使用。
    6. 不需要关系查询

    记录键将是字符串或长字符串。如上所述,读取将比写入更频繁,并且大多数读取将只是检查密钥是否存在(即,不需要读取与密钥相关的数据)。每个记录只更新一次,不删除记录。


    使现代化

    此后,通过减少对辅助键的依赖,改进了现有BDB设置的查询性能。有些查询需要连接两个辅助键,通过将它们组合成一个复合键,我消除了查找过程中的间接性,从而大大加快了查找速度。

    9 回复  |  直到 14 年前
        1
  •  20
  •   Andrejs    13 年前

    JDBM3 这正是你想要的。它是一个磁盘备份映射库,具有非常简单的API和高性能。

    这个项目现在已经发展成MapDB http://www.mapdb.org

        2
  •  6
  •   Juha Syrjälä    16 年前

    你可能想调查一下 OrientDB

        3
  •  6
  •   Harvinder Singh    11 年前

    您可以从中尝试Java编年史 http://openhft.net/products/chronicle-map/

        4
  •  3
  •   MikeFHay    13 年前

    我可能会使用本地数据库。喜欢说 Bdb JE HSQLDB . 请问这种做法有何不妥?你一定有理由去寻找替代品。

    由于存在性能问题,我想您已经在使用JDBC来处理这一问题,因此可能值得尝试HSQLB并阅读关于它的章节 Memory and Disk Use

        5
  •  3
  •   KIC    9 年前

    从今天起,我将使用 MapDB (基于文件/备份的同步或异步)或 Hazelcast . 在以后的版本中,您必须通过实现Java接口来实现自己的持久性,即由RDBMS支持。 OpenHFT

    注意:如果由于内存问题需要基于映射磁盘,最简单的选项是MapDB。Hazelcast可以用作缓存(分布式或非分布式),它允许您在时间或大小之后从堆中逐出元素。OpenHFT是堆外的,如果您只需要jvm重启的持久性,就可以考虑使用它。

        6
  •  1
  •   Joel    14 年前

    Tokyo Cabinet 成为一个简单的持久散列/映射,并且能够快速设置和使用。

    这个缩略示例取自 the docs ,显示了从持久映射保存和检索数据的简单程度:

        // create the object
        HDB hdb = new HDB();
        // open the database
        hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
        // add item 
        hdb.put("foo", "hop");
        hdb.close();
    
        7
  •  1
  •   Sam Dufel    9 年前

    SQLite就是这样做的。我从Java编写了一个使用它的包装器: http://zentus.com/sqlitejdbc

    正如我在评论中提到的,我已经成功地将SQLite用于千兆字节的数据和数亿行的表。如果你正确地考虑索引,它会非常快。

    唯一的问题是JDBC接口。与简单的HashMap相比,它很笨重。我经常为特定的项目编写一个JDBC包装器,它可以添加很多样板代码。

        8
  •  0
  •   james    16 年前

    JBoss (tree) Cache 这是一个很好的选择。您可以从JBoss独立使用它。非常健壮、性能好、灵活。

        9
  •  0
  •   Ray Hulha    9 年前