【问题标题】:what is the most effective way to persist HashMap?持久化HashMap的最有效方法是什么?
【发布时间】:2012-03-25 18:54:37
【问题描述】:

我有一个哈希映射(文本和布尔值之间的多对一关系):

name         flag
---------------------
"abc"        TRUE
"cde 12"     TRUE
"foo"        FALSE
"some text"  TRUE
etc...

我需要在 Java 应用程序中保留这个结构。这种结构将被扩展,但永远不会改变。这意味着我将向其中添加新记录,但永远不会删除或更改现有记录。极其重要的是搜索速度(我提供了name,它返回flag)。它的大小可能非常大(数百万条记录)。我考虑了多种选择:1) 具有一张表和一个索引的关系数据库,2) 平面文件,3) 纯 JVM 数据库。您有什么建议?

【问题讨论】:

    标签: java database-design


    【解决方案1】:

    我推荐 JDBM3 库,它提供了磁盘支持的 HashMap 和 TreeMap 实现。它快速、可扩展且易于使用。 Apache 2 许可证。

    来自网站:

    JDBM has outstanding performance; it can insert a million records per second and read them even faster

    【讨论】:

    【解决方案2】:

    考虑到记录的数量,我将使用以名称为键的关系数据库。

    但是,如果找不到名称,这意味着什么?

    如果未找到等于您的布尔值之一(例如 TRUE),那么您有一个白名单(或取决于上下文的黑名单),在这种情况下,我倾向于从数据库中删除标志列并将名称缓存在一个哈希集。

    如果 not found 是一个单独的值,那么如果您有足够的可用内存,您可以尝试将整个表缓存在哈希映射中。

    【讨论】:

      【解决方案3】:

      几百万?我们有一个包含 500 万条记录的数组的案例,我们将它们全部存储在内存中,以便使用二进制搜索获得快速结果,它是具有经度、纬度数据的 geoloc 数据,如果您有很多地址,则 DB 搜索将花费相当长的时间去查查看。 如果您有大量内存,则使用内存中的数组 - 使用 sqlite 或 mysql 的小型数据库。 sqlite 也可以处理大量数据,如果没有很多线程客户端可以更新您的结构,则不需要额外的服务器。 关于 sqlite 的限制 - Can SQLite handle 90 million records?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-28
        • 2010-09-28
        • 2010-12-29
        • 1970-01-01
        • 2021-04-02
        • 1970-01-01
        • 2016-10-14
        • 2017-09-14
        相关资源
        最近更新 更多