Насколько плохо использовать Hashmaps и ArrayLists при использовании огромных данных? - PullRequest
3 голосов
/ 27 декабря 2011

Я читаю XML-документ в HashMaps, ArrayLists, так что связь сохраняется даже в памяти. Мой код выполняет мою работу, но меня беспокоят итерации или вызовы функций, которые я выполняю на этих огромных картах и ​​списках. В настоящее время xml-данные, над которыми я работаю, не так велики. но я не знаю, что произойдет, если это произойдет. Какие тестовые случаи мне нужно выполнить на моей логике, использующей эти хэш-карты? Насколько плохо использовать коллекции Java для таких огромных данных? Есть ли для них альтернативы? Повлият ли огромные данные на сбой JVM?

Ответы [ 5 ]

11 голосов
/ 27 декабря 2011

Java-коллекции имеют определенные накладные расходы, которые могут значительно увеличить использование памяти (в крайнем случае, в 20 раз), когда они являются основными структурами данных приложения, а данные полезной нагрузки состоят из большого количества небольших объектов.Это может привести к завершению приложения с OutOfMemoryError, даже если фактические данные намного меньше доступной памяти.

  • ArrayList на самом деле очень эффективно для большого количества элементов, но неэффективно, когдау вас есть большое количество списков, которые пусты или содержат только один элемент.В этих случаях вы можете использовать Collections.emptyList() и Collections.singletonList() для повышения эффективности.
  • HashMap имеет ту же проблему, а также значительные накладные расходы для каждого элемента, хранящегося в нем.То же самое относится и к ArrayList.Если у вас большое количество элементов, могут быть альтернативные реализации Map, которые более эффективны, например, Google Guava .
  • Наибольшие накладные расходы возникают при хранении примитивных значений, таких как intили long в коллекциях, так как нужно оборачивать как объекты.В этих случаях коллекции GNU Trove предлагают альтернативу.
  • В частности, в вашем случае возникает вопрос: действительно ли вам нужно хранить все данные из XML в памяти сразу илиможете ли вы обработать его небольшими кусками.Вероятно, это было бы лучшим решением, если ваши данные могут стать произвольно большими.
  • Самое простое краткосрочное решение - просто купить больше памяти.Это дешево.
2 голосов
/ 27 декабря 2011

JVM не потерпит крах в том, что вы описываете. Что может произойти, это OutOfMemoryError. Кроме того, если вы долго сохраняете данные в этих коллекциях, у вас могут возникнуть проблемы со сборкой мусора. Вам действительно нужно хранить все данные XML в памяти?

1 голос
/ 27 декабря 2011

Если вы имеете дело с временными данными и вам нужен быстрый доступ к ним, у вас нет много альтернатив. Вопрос в том, что вы имеете в виду, когда говорите «огромный»? MegaBytes? Гигабайты? Терабайт?

Пока ваши данные не превышают 1G, IMHO, удерживая их в памяти, может быть в порядке. В противном случае вам следует подумать об альтернативах, таких как файлы DB (реляционные или NoSql) и т. Д.

В вашем конкретном примере я подумаю о замене ArrayList на LinkedList, если вам не нужен список произвольного доступа. ArrayList - это просто оболочка над массивом, поэтому, когда вам нужно 1 миллион элементов, он выделяет массив из 1 миллиона элементов. Связанный список лучше подходит для случаев, когда количество элементов велико, но скорость доступа к элементу по индексу равна o (n / 2). Если вам нужно и то, и другое (то есть огромный список и быстрый доступ), используйте TreeMap с индексом вместо ключа. Вы получите log (n) скорость доступа.

0 голосов
/ 27 декабря 2011

Насколько плохо использование коллекций Java для таких огромных данных?

Java Map реализации и (в меньшей степени) Collection реализации имеют тенденцию использовать справедливыеколичество памяти.Эффект наиболее заметен, когда типы ключ / значение / элемент являются типами-обертками для примитивных типов.

Есть ли для них альтернативы?

Существуют альтернативные реализации«коллекции» примитивных типов, которые используют меньше памяти;например, библиотеки GNU Trove.Но они не реализуют стандартные API-интерфейсы Java-коллекций, что серьезно ограничивает их полезность.

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

Лучшее решение - изменить дизайн приложения, чтобы не требовалось для представления всей структуры данных XML в памяти.(Если вы можете добиться этого.)

Повлияет ли огромный объем данных на сбой JVM?

Это может привести к тому, что JVM выдает OutOfMemoryError.Технически это не сбой, но в вашем случае использования это, вероятно, означает, что у приложения нет иного выбора, кроме как отказаться.

0 голосов
/ 27 декабря 2011

Какие тестовые случаи мне нужно выполнить на моей логике, использующей эти хэш-карты?

Почему бы не сгенерировать большие XML-файлы (например, в 5 раз больше, чем ваши текущие образцы данных) и проверить с ними ваши парсеры / хранилища памяти? Поскольку только вы знаете, какие файлы возможны в вашем случае, насколько быстро они будут расти, это единственное решение.

Насколько плохо использовать коллекции Java для таких огромных данных? Есть ли альтернативы для них? Повлият ли огромные данные на сбой JVM?

Конечно, возможно, что у вас возникнет исключение OutOfMemory, если вы попытаетесь сохранить слишком много данных в памяти, и оно не подходит для GC. Эта библиотека: http://trove.starlight -systems.com / заявляет, что она использует меньше памяти, но я не использовал ее сам. Некоторое обсуждение доступно здесь: Какая библиотека Java Collections наиболее эффективна?

...