2015-09-05 3 views
0

Наше приложение представляет собой решение на основе gigaspace, которое в основном считывает из нескольких плоских файлов и сохраняет данные в объекте. Теперь плоские файлы в основном содержат некоторые детали отправки. Таким образом, у нас есть несколько файловЭффективные коллекции памяти в java

  1. Верфь Деталь
  2. Контейнер деталью
  3. Пересылка Детали
  4. т.д.

Теперь у нас есть Dockyard как родительский объект, под которым можно много объектов отгрузки Детали. В настоящее время мы используем ArrayList для хранения данных о доставке для почти 50 000 объектов док-станции. Текущий объем данных предполагает, что для каждого объекта Dockyard нам нужно будет обслуживать около 1500 объектов детализации отправки, и в куче будет находиться почти 50-килограммовый объект верфи. Наша текущая куча составляет 8 ГБ.

Так что хотелось бы знать, является ли ArrayList лучшим способом для хранения такого количества объектов. Я искал другие API, а также trove, HPPC, но они в основном предлагают преимущества, когда дело доходит до примитивной коллекции. Наше будет коллекция объектов. Таким образом, кроме увеличения размера кучи. может ли кто-нибудь предложить другие лучшие альтернативы.

+1

, когда размер данных такой большой, хранение данных в памяти приложения никогда не является хорошей идеей. – afzalex

+0

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

+0

Лучше всего что-то сделать очень быстро. Если вы не ожидали, что это много данных первоначально, как вы думаете, что будет через 6 месяцев. Ваша реализация просто не будет масштабироваться. – Andreas

ответ

1

Вам не нужно хранить все объекты в куче. Например, с помощью Chronicle Map вы можете сохранить все объекты с кучи, и поскольку они представляют собой файлы с отображением памяти, они даже не должны быть в памяти. Вы можете обнаружить, что вы можете уменьшить размер кучи, если основная часть ваших данных находится вне кучи.

будет почти 50-килограммовый объект верфи, лежащий в куче.

Это не очень много объектов. Даже если каждый объект использует 1 КБ, тогда вы используете только 50 МБ. Если вы возражаете гораздо больше, чем это, очень вероятно, что вы должны посмотреть на способы уменьшить размер отдельных объектов.

Когда мы используем коллекции на основе примитивов, главным образом, чтобы избежать заголовка объекта для каждого элемента. Это экономит 8 - 16 байт на запись или до 800 КБ в вашем случае.

Однако, если у вас есть объекты от 1 КБ до 100 КБ, как вы предлагаете, вы можете сократить вдвое размер, используемый ими в памяти, путем их реструктуризации или использования разных типов данных.

BTW a 1 GB стоит около часа вашего времени. Я бы исследовал удвоение объема памяти, прежде чем тратить слишком много времени на это.

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