Задняя часть оценок конвертов помогает в достижении согласия с подобными вещами. Если у вас есть миллионы записей на карте, скажем 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 с миллисекунд в наши дни.
Итак, если все, что вам нужно, это загрузить данные и запросить/мутировать их по строкам, которые вы описываете, вы можете просто найти, что современный сервер может легко бороться с решением ванили. Я бы порекомендовал вам дать это, возможно, прототип с некоторыми репрезентативными наборами данных и посмотреть, как это работает. Если у вас есть проблема, вы всегда можете найти более экзотические/эффективные решения.
Настоятельно рекомендуем использовать внешнюю базу данных (SQL или NoSQL). Сотни чтения и записи в секунду не так уж много, но миллионы записей с большим количеством записей будут приводить к большему количеству боли в GC, если вы попытаетесь сохранить все это в 1 JVM. И что происходит, когда эта JVM умирает? –
Я не хочу говорить о том, что происходит, когда JVM умирает ... (Все эти данные сериализуются и сохраняются). Я рассмотрю SQL –
HBase, memcached, redis и т. Д. - почти любой из них должен работать достаточно хорошо, основываясь на ваших потребностях, описанных до сих пор. –