【问题标题】:Java, Recommended way to Persist HashMaps for permanent, Reliable storage?Java,推荐持久化 HashMap 以实现永久、可靠存储的方法?
【发布时间】:2011-07-17 08:07:19
【问题描述】:

我正在从事一个项目,该项目正在对大量数据进行大量搜索,因此我意识到使用传统的数据库结构无法正常工作,因为我需要将表读取为 HashMap 格式,并且保持不变一直在内存中,以便能够在应用程序性能所需的时间内运行查询。

我想知道持久化 HashMap 的推荐过程是关于从其持久状态中检索它们的速度以及最小化所需的额外代码(因为现在我正在编写从 DB 表中读取必要数据的自定义类和然后创建一个嵌套的 HashMap 反映我需要它尽快搜索到的数据结构.我不确定简单地写入文本文件是否是确保数据的正确方法已保存且未损坏。感谢任何建议

【问题讨论】:

标签: java data-structures hashmap


【解决方案1】:

您是否考虑过使用键值对数据库(如 Redis 或 Riak)?

【讨论】:

  • 我不熟悉这些,但肯定会去看看,谢谢你的提示
【解决方案2】:
  1. Ehcache
  2. disk-backed-map

下面的帖子也可能对你有所帮助

recommend-a-fast-scalable-persistent-map-java

【讨论】:

    【解决方案3】:

    如果您将数据库中的内容粘贴到哈希结构中以加快对数据库内容的搜索,我认为您可能采取了错误的方法。我不知道你到底想做什么,但也许使用像Lucene 这样的索引是合适的?这是一个成熟且高度优化的索引,将处理诸如在内存中缓存频繁查询之类的事情。

    或者看看BerkeleyDB,它基本上是一个磁盘支持的哈希数据库。也非常快。 (尽管请注意,我相信 Oracle 现在可能需要为此某些用例提供许可证)。

    对 Lucene 和 BerkeleyDB 的唯一警告是它们需要一些开销来设置。所以我的最后一个建议是Tokyo-Cabinet,这是一个相当不错、非常快速且非常简单易用的磁盘支持哈希。基本上只需将 jar 包含在您的类路径中并像 HashMap 一样使用它:

    import tokyocabinet.HDB;
    
    ....
    
    String dir = "/path/to/my/dir/";
    HDB hash = new HDB();
    
    // open the hash for read/write, create if does not exist on disk
    if (!hash.open(dir + "unigrams.tch", HDB.OWRITER | HDB.OCREAT)) {
        throw new IOException("Unable to open " + dir + "unigrams.tch: " + hash.errmsg());
    }
    
    // Add something to the hash
    hash.put("blah", "my string");
    
    // Close it
    hash.close();
    

    就是这样。您粘贴在哈希中的任何内容都会保存到磁盘上,并且可以稍后重新加载。不用担心速度,内存优化会在后台为您处理。

    编辑:东京内阁似乎已被Kyoto Cabinet取代。

    编辑 2:你没有说你正在使用什么数据库,但如果 MySQL 不为你工作 full text search

    【讨论】:

    • 在对此进行了更多研究之后,我认为与 NoSQL 数据库(我刚刚熟悉的概念)相比,在我的情况下,使用关系数据库有明显的缺点。我正在开发一个搜索引擎应用程序,所以我认为摆脱关系数据库是必要的,无论如何,感谢您提供的信息,京都内阁是我现在肯定考虑使用的东西
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2012-01-10
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多