Лучше ли использовать базу данных в памяти (например, SQLite), чем хранить все в HashMap или других структурах данных? - PullRequest
3 голосов
/ 24 декабря 2009

Мне нужен очень быстрый доступ к большой карте - несколько миллионов записей. Стоит ли использовать базу данных SQLite в памяти, чтобы сохранить эту карту, а не просто хранить эту HashMap в памяти?

Ответы [ 4 ]

6 голосов
/ 24 декабря 2009

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

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

2 голосов
/ 24 декабря 2009

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

Если вы решите, что карта подходит, то вам следует тщательно выбрать нужный тип карты. Взгляните на полный спектр Карт, доступных в java.util.collections, а также внимательно посмотрите на Коллекции Google, которые расширяют возможности Java несколькими очень приятными способами. Также посмотрите на java.util.concurrent, у которого есть хороший ConcurrentHashMap, который позволит одновременно использовать вашу структуру данных несколькими потоками.

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

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

0 голосов
/ 24 декабря 2009

В дополнение к превосходным замечаниям Алона и Джима, я бы предложил попробовать оба подхода и сравнить производительность. Помимо того, что это весело (по общему признанию вызывающим способом), этот тест вынудит вас инкапсулировать вашу структуру данных только правильным способом, так чтобы раскрылись только основные функции.

0 голосов
/ 24 декабря 2009

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

...