Насколько эффективна будет использоваться в базе данных памяти для хранения миллионов временных значений?

StackOverflow https://stackoverflow.com/questions/3936044

Вопрос

Мое приложение в настоящее время хранит миллионы Double элементы для расчета. Эти значения являются только временными значениями, прежде чем они используются для определенного алгоритма, который работает в конце расчета. Как только этот расчет будет сделан, миллионы значений могут быть отброшены.

Полная история здесь, если вам нужно больше деталей.

Одним из предложенных решений является использование базы данных в памяти.

Поэтому, если я пойду с этим решением, я буду использовать эту базу данных для хранения моих значений в таблице, чтобы заменить мой текущий Map<String, List<Double>>, подобно:

create table CALCULATION_RESULTS_XXX (
  deal_id varchar2,
  values number
);

(одна таблица на расчет, XXX это идентификатор расчета)

Таким образом, во время расчета я сделаю следующее:

  1. Когда расчет запущен, я создаю CALCULATION_RESULTS_XXX стол.
  2. Каждый раз, когда мне нужно добавить значение, я вставляю запись в эту таблицу.
  3. В конце расчета я использую контент таблицы для моего алгоритма.
  4. Наконец, я бросаю эту таблицу.

Как объяснено в другом тема, В настоящее время мой расчет может хранить несколько сотен MB данных в памяти в виде списка 30 * 1 000 000 Double понадобится около 240 МБ.

Вопросы сейчас:

  1. Если я пойду с базой данных в памяти, будет ли будет сокращение моего памяти?
  2. Каковы конкретные точки, которые мне придется позаботиться о использовании базы данных (или создания таблицы), вставьте данные и т. Д.?
  3. Я думаю, что я выберу База данных H2. Отказ Как вы думаете, это лучший выбор для моих потребностей?
Это было полезно?

Решение

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

У вас уже есть реализация, которая просто использует простые структуры в памяти. Лично, учитывая, что даже самый дешевый компьютер от Dell поставляется с 1 ГБ + ОЗУ, вы могли бы также придерживаться этого. Кроме того, это должно быть довольно просто в базе данных или два. Я бы рассмотрел Sleepycat Berkerly DB (который теперь принадлежит Oracle ...), потому что вам не нужно использовать SQL, и они должны быть довольно эффективными. (Они поддерживают Java).

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

Другие советы

Простой хешмап, подкрепленный Терракота Сделал бы лучше и позволит хранить коллекцию больше, чем JVM виртуальная память.

Встроенные базы данных, особенно, на основе SQL, добавят сложность и накладные расходы на ваш код, поэтому оно не стоит этого. Если вам действительно нужно постоянное хранение со случайным доступом, попробуйте один из NoSQL DBS, как Couchdb., Кассандра, Neo4J.

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

Если вы заканчиваются алгоритмом, можно выразить в SQL, это также стоит того, чтобы сделать ваше время, чтобы сделать это, и не загружать все списки обратно. В любом случае, не помещайте ничего понравившегося или ограничения на значения, а предпочтительно Также не разрешить нулю (если возможно). Ведение индексов и затрат от ограничений, а также позволяющее нулю также может стоить времени или создавать накладные расходы. Deal_IDs может (и есть), конечно, проиндексированы как основные ключи.

Это не очень много, но, по крайней мере, лучше, чем один из-за того, что ответный ответ :)

На самом деле нет никаких оснований, чтобы добавить внешний компонент, чтобы ваша программа запустилась медленнее. Сжимайте блок данных и напишите его в файл, если вам нужно обрабатывать больше, чем доступна внутренняя память. Рабочая станция теперь занимает 192 ГБ ОЗУ, поэтому вы не можете позволить себе тратить много времени на это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top