我正在开发一个项目,其中对大量数据进行了大量搜索,因此我意识到使用传统的数据库结构它不起作用,因为我需要将表读入HashMap格式,在内存中的整个时间,能够在应用程序性能所需的时间内运行查询。
我想知道维护HashMap的推荐过程是关于从持久状态检索它们的速度以及最小化所需的额外代码(现在我正在编写从DB表中读取必要数据的自定义类)然后创建一个嵌套的HashMap,反映我需要它的数据结构,以便尽快搜索。我不确定是否只是写一个文本文件是一个正确的方法来做到这一点,以确保数据保留,没有损坏。任何建议表示赞赏
答案 0 :(得分:4)
您是否考虑过使用键值数据库(如Redis或Riak)?
答案 1 :(得分:2)
以下帖子也可以帮助您
答案 2 :(得分:2)
如果您要将数据库中的内容粘贴到哈希结构中以加快对数据库内容的搜索速度,我认为您可能采取了错误的方法。我不知道你要做什么,但也许使用像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不适合你呢?