2014-02-19 5 views
-4

Мы все избили с ошибкой OutOfMemory. Это происходит, если мы храним больше символов, чем предел String, если мы превысим предел StringBuffer, если мы превысим лимит ArrayList и так далее. Существует большой список. Но стоит отметить, что крупнейшие в мире проекты Big Data построены на Java, включая Amazon. Поэтому у меня есть вопрос. Может ли Java хранить в памяти 70 МБ файл? Этот файл содержит текст, и каждая отдельная строка этого файла будет сохранена как элемент в LinkedList. Итак, если файл получил 200 000 строк, то LinkedList будет содержать 200 000 элементов. Представьте, что у меня есть оперативная память 4-5 ГБ.Java VS RAM: Сколько данных Java может обрабатывать без 'OutOfMemory'?

Может ли Java обрабатывать что-то вроде этого, не бросая OutOfMemory? В любом случае, я не хочу вручную изменять размер кучи.

Ваш совет?

Update

Не предназначаться для 70MB. Представьте, что в будущем это заполнение составит 300 ГБ. У меня есть оперативная память 500 ГБ (да, я в большом проекте данных, RAM больше, чем это в любом случае). Что теперь?

+0

Вы можете отобразить файл в памяти и сохранить указатели на разные строки. Это даже проще, если линии имеют одинаковую длину, конечно. И сопоставления файлов не «загрязняют» кучу. См. 'FileChannel.map()'. – fge

+0

Это скорее настройка JVM, чем ограничение языка. ' – thatidiotguy

+0

@fge: Пожалуйста, взгляните на обновление. – Dongle

ответ

0

Да, Java может легко хранить файл размером 70 МБ в памяти

+0

Пожалуйста, посмотрите обновление, которое я сделал. – Dongle

+0

Я думал, что Java не может. – Dongle

0

Ответ? «Это зависит» из-за модели памяти поколений.

OutOfMemoryError обычно бывает, когда вы исчерпаете пермит gen, а не в целом память.

Ваша операционная система также имеет эффект. Теперь 32-битная JVM позволит вам куча размером более 1,2-1,5 ГБ, потому что операционная система и JVM берут свою долю.

64-разрядная операционная система и JVM позволят вам иметь намного больше ОЗУ для кучи.

Единственными ограничениями на StringBuffer и List являются ints для индексов и размеров (Integer.MAX).

+0

Пожалуйста, взгляните на обновление, которое я сделал. – Dongle

+0

Ничего не добавляет. Вам придется изменить конфигурацию JVM. – duffymo

1

Вы можете изменить объем памяти виртуальной машины Java (JVM) при запуске вашей программы, добавив следующие параметры в начало программы.

  • -Xms<initialSize>
  • -Xmx<maxSize>

initialSize Заменить и maxSize с любыми соответствует вашим требованиям (и ограничения).

Пример

Ниже будет работать HelloWorld.class с начальным размером кучи 64 МБ и максимальным размером кучи 256 МБ.

ява -Xms64m -Xmx256m HelloWorld

0

Буферизация всегда разумный ответ при обработке больших объемов данных из файлов: вы почти никогда не нужно, чтобы загрузить полный файл 1-10-100 GB в память, но только небольшие куски. Если вы это сделаете, вы должны, вероятно, пересмотреть свой дизайн.

Кроме того, масштабирование системы «больших данных» становится экономически эффективным только в том случае, если вы можете использовать удобное оборудование (дешевые серверы с низким уровнем обслуживания), где ограниченные ресурсы, в том числе и память, ограничены (подумайте о 16 ГБ на машину или даже меньше, в некоторых ранних тестах использовались машины с 2 ГБ ОЗУ), как описано в оригинальной бумаге Google MapReduce.

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

Поэтому, если у вас нет файлов, где каждая строка имеет размер 4 ГБ, это не проблема. И если вы это сделаете, вы должны, вероятно, переосмыслить свой дизайн, стратегию сбора данных, инфраструктуру или выбросить злой разум, который решил, что было бы хорошей идеей организовать ваши данные таким образом.

И, наконец, чтобы задать конкретный вопрос, если у вас есть сервер с объемом 500 ГБ, доступный для вас, почему бы вам не запустить некоторые тесты? Попробуйте разные размеры файлов, разные типы файлов (JSON, XML, plain, CSV) и различные способы загрузки (сканеры, буферизованные считыватели и т. Д.) И сохраните данные в памяти (карты, списки строк, объекты, подобные DOM, и т.д.). Тогда, пожалуйста, поделитесь своими выводами с нами, потому что это звучит весело!

+0

Спасибо за рельс. Одна строка не займет 4 ТБ. Допустим, что весь текстовый файл будет 200 ГБ. – Dongle

+0

Снова попробуйте сами. И снова, вы уверены, что вам нужно загрузить все это в память? –

+0

Это то, к чему меня просят. – Dongle

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