(Java) Хранить огромную коллекцию объектов с индексированными атрибутами - PullRequest
3 голосов
/ 25 июля 2010

Мне нужно хранить около 100 тысяч объектов, представляющих пользователей. У этих пользователей есть имя пользователя, возраст, пол, город и страна.

Пользователи должны быть доступными для поиска по возрасту и любым другим атрибутам, но также по комбинации атрибутов (например, женщины от 30 до 35 лет из Брюсселя). Результаты должны быть найдены быстро, поскольку это одна из служб Сервера для многих подключенных Клиентов). Пользователи могут быть только удалены или добавлены, но не обновлены.

Я думал о быстрой базе данных с индексированными атрибутами (например, h2 db, которая кажется довольно быстрой, и я видел, что у них есть режим в памяти)

Мне было интересно, возможен ли какой-либо другой вариант перед тем, как перейти к БД.

Спасибо за любые идеи!

Ответы [ 4 ]

2 голосов
/ 25 июля 2010

Я бы использовал RDBMS - есть много хороших доступных ORM, таких как Hibernate , которые позволяют прозрачно вставлять POJO в БД. После того, как вы получите доступ к данным, у вас появится свобода выбора, как лучше сохранить данные.

Для проекта такого размера я бы использовал базу данных H2 . Он имеет как встроенный, так и клиент-серверный режимы и может работать с диска или полностью в памяти.

2 голосов
/ 25 июля 2010

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

Потому что все, что вы описываете, может быть выполнено на очень простом сервере, помещено в очень простую базу данных и даст вам желаемые результаты порядка 100 мс на запрос. Вам нужно быстрее, чем 100 мс времени отклика? Зачем?

1 голос
/ 25 июля 2010

Наиболее определенно реляционная база данных. При таком размере вам понадобится система клиент-сервер, а не что-то встроенное, как Sqlite. Выберите одну систему в зависимости от дальнейших требований. Индексирование является базовой функцией, большинство систем его поддерживают. Лично я бы попробовал что-то популярное и бесплатное, такое как MySQL или PostgreSQL, чтобы вам было легче найти выход из проблем. Если вы сделаете ваши SQL-запросы достаточно общими (без специфических для поставщика конструкций), вы сможете переключать системы без особых проблем. Я согласен с bwawok, попробуйте, достаточно ли стандартна установка, и подумайте об оптимизации позже.

0 голосов
/ 12 августа 2011

Думаете ли вы использовать систему кэширования, такую ​​как EHCache или Memcached?Кроме того, если у вас достаточно памяти, вы можете использовать некоторую отсортированную коллекцию, например, TreeMap в качестве карты индекса или HashMap для поиска пользователя по имени (отдельная карта для каждого поля).Это займет больше памяти, но может быть эффективным.Также вы можете найти на основе пользовательского запроса наиболее часто используемый запрос с лучшей избирательностью и создать компаратор на основе этого запроса только.В этом случае подмножество элемента не будет большим и может быть быстро отфильтровано без какой-либо дополнительной оптимизации.

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