производительность Java ухудшается из-за arraylist размером более 6000

1

Привет, я использую jdk7 и ram 6GB с процессором intel corei5. У меня есть Java-код, который имеет размер arraylist более 6000, и каждый элемент в этом массиве содержит 12 двойных значений. Скорость обработки значительно уменьшилась, и теперь она принимает около 20 минут для запуска всего кода.

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

Есть около 4500 итераций, происходящих из-за вложенных циклов... и на каждой итерации читается файл размером 400 Кб, и происходит некоторая обработка, а некоторые значения хранятся в arraylist.

Как только аррайалист готов, значения arraylist записываются в другой файл через csvwriter.и затем я использовал jtable, а jtable также требовал, чтобы arraylist ссылался на некоторые значения в этом arraylist.so в основном я не могу очистить этого arraylist.

Я дал значения для памяти кучи следующим образом

-Xms1024M -Xmx4096M

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

  • 6
    Это не похоже на проблему с памятью, поскольку 8*12*6000 = 576000 меньше 1 МБ. Похоже, у вас есть алгоритмическая проблема. Если вы обновите свой вопрос с более подробной информацией о том, какую обработку вы выполняете, мы сможем помочь вам лучше.
  • 1
    Я сомневаюсь, что это проблема памяти. Попробуйте добавить информацию о профилировании (или даже использовать профилировщик).
Показать ещё 5 комментариев
Теги:
performance

3 ответа

2
Лучший ответ

12 x 8 x 6000 удваивают не собираются занимать значительное количество памяти

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

В этом вопросе есть несколько примеров причин утечки памяти в Java.

Использование VisualVM или некоторых ручных протоколов поможет определить проблему. Также могут помочь статический код anaylsers, такой как FindBugs или PMD.

2

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

Обычно то, что вы делаете, когда сталкиваетесь с такими проблемами производительности, как это, является профилем, либо с помощью чего-то вроде VisualVM либо вручную, используя System.nanoTime() чтобы отслеживать, какая часть вашего кода является узким местом. Оттуда вы убедитесь, что используете соответствующие структуры данных, алгоритмы и т.д., А затем посмотрите, где вы можете распараллелить свой код.

  • 0
    я сказал, что размер кучи был проблемой, потому что у меня был тот OutOfMemoryError дважды, после чего я увеличил память до 4096M
0

Наверное, вы как-то утечка JTable. Это может легко случиться с Listeners, TableSorters и т.д. Правильный инструмент скажет вам, но лучшим способом является ИМХО, чтобы разложить проблему.

Либо это часть GUI, что создает проблемы или нет. В идеале оставшаяся программа должна быть полностью независимой от графического интерфейса, поэтому вы можете запускать ее изолированно, и вы увидите, что происходит.

Мой старший предлагает использовать память на жестком диске для хранения элементов или обработки arraylist, но я сомневаюсь, что это возможно.

Многое возможно, но мало что имеет смысл. Если вы действительно храните только 12 x 8 x 6000 удваивается, тогда это не имеет никакого смысла. Даже с большими издержками Double, это всего несколько мегабайт.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню