Java, рекомендуемый способ сохранения HashMaps для постоянного надежного хранения? - PullRequest
5 голосов
/ 17 марта 2011

Я работаю над проектом, в котором проводится большой поиск по очень большому набору данных, поэтому я понимаю, что использование традиционной структуры базы данных не работает, так как мне нужно читать таблицы в формате HashMap, который остается в памяти все время, чтобы иметь возможность выполнять запросы в течение времени, необходимого для производительности приложения.

Мне интересно, каков рекомендуемый процесс прохождения HashMap с точки зрения скорости извлечения их из постоянного состояния и минимизации необходимого дополнительного кода (как сейчас я пишу пользовательские классы, которые читают необходимые данные из таблиц БД и затем создайте вложенный HashMap, отражающий структуру данных, в которой я нуждаюсь, чтобы она была доступной для поиска как можно быстрее. Я не уверен, что простая запись в текстовый файл будет правильным способом сделать это, чтобы убедиться, что данные сохраняется и не портится. Любой совет ценится

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

Рассматривали ли вы использование баз данных ключ-значение (например, Redis или Riak)?

2 голосов
/ 17 марта 2011

Если вы вставляете содержимое из вашей БД в хеш-структуру, чтобы ускорить поиск по содержимому БД, я думаю, что вы, вероятно, используете неправильный подход. Я не знаю, что именно вы пытаетесь сделать, но, возможно, уместно использовать индекс типа 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();

И это все. Все, что вы вставите в хеш, сохраняется на диске и может быть перезагружено позже. И не беспокойтесь о скорости, оптимизация в памяти выполняется за кулисами.

Редактировать: Похоже, кабинет Токио был заменен Кабинет Киото .

Редактировать 2: Вы не говорите, какую БД вы используете, но если MySQL полнотекстовый поиск у вас не работает?

2 голосов
/ 17 марта 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...