2010-07-25 2 views
3

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

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

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

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

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

+0

Звучит как база данных для mé ..... –

ответ

2

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

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

+0

Объекты простые POJO, содержащие некоторые целые числа и строки, возможно, и небольшой список строк. Не слишком дорого, я думаю, однако их может быть 100 тысяч. Я действительно не могу догадаться, что это займет огромное количество ОЗУ на приличном копуле. Я думал об альтернативах, потому что SQL-запросы будут в основном включать операции ввода-вывода. Получение результата из памяти будет намного быстрее.Теперь, если нет каких-либо простых альтернатив (возможно, мне не хватало чего-то простого в использовании), тогда, конечно, я пойду за БД. – Matthew

+0

База данных, естественно, хранит в использовании материал в памяти. Он также будет использовать индексы для ускорения ваших запросов. Для нескольких 100k простых записей вы можете запрашивать и получать информацию в порядке порядка 100 мс. Является ли 1/10 секунды слишком длинными? Нет ничего плохого в том, чтобы делать это в памяти, но вам действительно нужно требование быстрого (может быть, 1/100th секунды против 1/10 секунды), чтобы беспокоиться об этом. – bwawok

1

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

+0

Почему не что-то встроенное? Разве это не быстрее? Не могли бы вы это уточнить? Я собирался сделать что-то вроде H2 DB. – Matthew

+0

H2 может быть или не быть быстрее. Но вам действительно нужна деловая необходимость, прежде чем вы идете по этому пути, так как в будущем вы можете вставить бокс в угол. – bwawok

+0

Должен сказать, что я никогда не пробовал таблицу строк 100K с Sqlite 3, возможно, она работает нормально, если у вас никогда не будет нескольких пользователей, одновременно пытающихся обновить базу данных. Но все это будет в одном регулярном файле в вашей обычной файловой системе, мне кажется, это кажется мне неприятным. Обязательно попробуйте это; вы также можете попробовать Firebird, который поддерживает как встроенный, так и клиент-серверный доступ и обладает некоторыми замечательными функциями, но не так популярен, как некоторые другие системы. – reinierpost

2

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

Для этого размера проекта я бы использовал H2 database. Он имеет как встроенные, так и клиентские/серверные режимы и может работать с диска или полностью в памяти.

+0

+1 для внутренней памяти, если требуется хранить память. Не рекомендуется использовать спящий режим для этого случая, поскольку объектная модель тривиальна (1 таблица/класс). –

+0

Я думал о коэффициенте поиска - API спящего критерия упрощает поиск запросов по произвольным атрибутам и значениям, чем динамическое построение SQL-запроса. Кроме того, спящий режим растет с вашим проектом, приносящим полезные функции, особенно в сочетании с Spring (декларативные транзакции, аудит и различные перехватчики для подключения к уровню персистентности - перехватчики), которые помогают обеспечить хорошую структуру. – mdma

0

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

Смежные вопросы