2015-12-25 4 views
0

Я работаю над проектом, который требует, чтобы я хранили (потенциально) миллионы карт-значений и делал (потенциально) 100 запросов. Есть некоторые проверки, которые я могу делать с данными, с которыми я работаю, но это немного уменьшит нагрузку. Кроме того, я буду делать (потенциально) 100 секунд put/удаляет секунду, поэтому мой вопрос: есть ли карта, достаточная для этой задачи? Есть ли способ оптимизировать карту? Есть ли что-то более быстрое, что будет работать для хранения сопоставлений ключевых значений?Массивная производительность карты (java)

Дополнительная информация; - Ключ будет точка в 3D-пространства, я чувствую, что это означает, что я мог бы использовать массивы, но массивы должны быть массивными - Значение должно быть объектом

Любая помощь будет принята с благодарностью!

+2

Настоятельно рекомендуем использовать внешнюю базу данных (SQL или NoSQL). Сотни чтения и записи в секунду не так уж много, но миллионы записей с большим количеством записей будут приводить к большему количеству боли в GC, если вы попытаетесь сохранить все это в 1 JVM. И что происходит, когда эта JVM умирает? –

+0

Я не хочу говорить о том, что происходит, когда JVM умирает ... (Все эти данные сериализуются и сохраняются). Я рассмотрю SQL –

+0

HBase, memcached, redis и т. Д. - почти любой из них должен работать достаточно хорошо, основываясь на ваших потребностях, описанных до сих пор. –

ответ

0

Задняя часть оценок конвертов помогает в достижении согласия с подобными вещами. Если у вас есть миллионы записей на карте, скажем 32M, а ключ - это трехмерная точка (так что 3 ints-> 3 * 4B-> 12 bytes) -> 12B * 32M = 324MB. Вы не указали размер значения, но при условии, что у вас есть аналогичное значение, вы можете удвоить эту цифру. Это Java, поэтому, предполагая 64-битную платформу с сжатыми ООП, которая по умолчанию и что большинство людей включено, вы платите дополнительный 12-байтный заголовок объекта для каждого объекта. Итак: 32M * 2 * 24B = 1536MB.

Теперь, если вы используете HashMap, для каждой записи требуется дополнительный HashMap.Node, в Java8 на платформе выше вы смотрите 32B на узел (используйте OpenJDK JOL, чтобы узнать размеры объектов). Это подводит нас к 2560 МБ. Также заберите стоимость массива HashMap, а 32M-записи вы увидите таблицу с записями 64M (потому что размер массива равен 2, и вам нужно немного отстать от ваших записей), так что это дополнительный 256 МБ. Все вместе позволяет объединить его до 3 ГБ?

Большинство серверов в наши дни имеют довольно большой объем памяти (от 10 до 100 ГБ) и добавление дополнительных 3 ГБ в комплект JVM live не должно вас напугать. Вы можете счесть это разочаровывающим, что накладные расходы превышают данные в вашем случае, но это не ваше эмоциональное благополучие, это вопрос о том, будет ли он работать ;-)

Теперь, когда вы загрузили данные, вы мутируя его со скоростью 100 с вставки/удаления в секунду, скажем 1024, повторное использование над величинами мы можем суммировать: 1024 * (24 * 2 + 32) = 70 КБ. Измельчение 70 Кбайт мусора в секунду - небольшое изменение для многих приложений, а не то, что вам обязательно нужно вспотеть. Чтобы показать это в контексте, JVM будет бороться со сбором многих 100 МБ молодого поколения в течение 10 с миллисекунд в наши дни.

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

+0

Если мутация такая частая, простая HashMap с глобальной блокировкой, вероятно, будет убивать производительность. Скорее всего, требуется ConcurrentHashMap или что-то подобное. – jtahlborn

+0

@jtahlborn OP ничего не говорил о параллельном доступе, поэтому я ничего не понял ... 1000 операций/сек не проблема даже для стандартной блокировки RW.CHM имеет очень большой след накладных расходов, вам может быть лучше с Cliff Clicks блокировки свободной карты. –

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