2012-04-24 2 views
1

У меня есть приложение swing, которое работает в CSV-файле. Он читает полный файл по строкам, вычисляет некоторые требуемые статистические данные и выводит результат. Верхняя часть экрана вывода показывает каждую запись из файла в этом порядке в JTable, тогда как нижняя часть показывает статистику, вычисленную на основе этих данных. Проблема в том, что JVM занимает в 4 раза больше памяти, чем размер файла. (в то время как обработка 86 Мбайт области Heap использует 377 МБ использования памяти в памяти, используя jVisualVM).Чтение большого файла в Java

Примечание:

  1. Я использовал LineNumberReader для чтения файла (обусловленно конкретных требований, я могу изменить его, если это помогает в использовании памяти)

  2. Для чтения каждой строки ReadLine() является и затем .split (',') этой строки, которая является String, вызывается для отдельных полей этой записи.

  3. Каждая запись хранится в векторе для отображения в JTable, тогда как другая статистика хранится в HashMap, TreeMap и сводных данных в классе JavaBean. Также один график отображается с использованием JFreeChart.

Пожалуйста, предлагайте уменьшить использование памяти, поскольку мне нужно обработать файл 2 ГБ.

+0

Чтобы быть ясным, вы говорите, что вам нужно хранить весь файл 2GB в векторе и отображать его в JTable? – NPE

+0

Вы можете сделать это с помощью 8-гигабайтной кучи, или вы можете загружать только те части файла, которые вам нужно отобразить. –

+0

yes Я хочу, чтобы этот 2GB-файл в памяти, но он не должен в 4 раза больше места. – Rony

ответ

0

Используйте лучшие практики обновить программу

  1. Записи многопоточных в программе, чтобы получить лучшее использование центрального процессора.
  2. Установите кучу минимального и максимального размера кучи, чтобы лучше использовать баран.
  3. Используйте правильную структуру данных и дизайн.
+0

Использование ЦП не является моей проблемой, но использование памяти. – Rony

+0

http://java.sun.com/performance/reference/whitepapers/tuning.html Надеюсь, это было бы полезно для u :) –

1

Попробуйте дать OpenCSV выстрел. Он сохраняет только последнюю строку чтения, когда вы используете метод readNext(). Для больших файлов это идеально.

С их сайта, являются следующими функциями, которые они поддерживают:

  • Произвольных чисел значений в строку

  • Игнорирования запятые в цитируемых элементах

  • Обработки цитируемой записей со встроенной кареткой (т.е. записи , которые охватывают несколько линий)

  • Конфигурируемые разделители и символы квотирования (или использовать осмысленные по умолчанию)

  • Читать все записи сразу, или использовать модель итератора стиль

  • Создание CSV файлов из String [] (то есть. автоматическое экранирование встроенных цитаты символов)

0

объект Каждого Java имеет a memory overhead, так что если ваши струны действительно короткие, которые могли бы объяснить, почему вы получаете в 4 раза размера файла. Вы также должны вычислить размер вектора и его внутренних элементов.Я не думаю, что Map улучшит использование памяти, поскольку Java-строки уже пытаются указать один и тот же адрес в памяти, когда это возможно.

Я думаю, вы должны пересмотреть свой дизайн. Учитывая ваши требования

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

вам не нужно сохраните весь файл в памяти. Вам нужно прочитать его полностью, чтобы вычислить свою статистику, и это, безусловно, можно сделать, используя очень небольшой объем памяти. Что касается части JTable, это может быть выполнено несколькими способами: без, требующим 2 ГБ места для кучи для вашей программы! Я думаю, что что-то не так, когда кто-то хочет сохранить CSV в памяти! Apache IO LineIterator

+0

отображение полного файла является частью требования! – Rony

+0

Отображение файла и сохранение его в памяти - это две совершенно разные вещи – Raffaele

0

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

  1. Попробуйте изменить алгоритмы статистики, чтобы выполнять их работу по мере считывания данных и не требовать, чтобы все они существовали в памяти. Вы можете найти алгоритмы, которые приблизительно соответствуют статистике.
  2. Если ваши данные содержат много повторяющихся строковых литералов, используйте HashSet для создания кеша. Помните, что кэши известны тем, что они являются утечками памяти (например, не очищают их перед загрузкой разных файлов).
  3. Уменьшить объем данных, отображаемых на графике. Для графа с множеством данных обычно имеется много точек, отображаемых на одном пикселе или рядом с ним. Рассмотрим усечение данных путем слияния нескольких значений в одном и том же положении по оси x или около нее. Например, если ваш набор данных содержит 2 000 000 точек, большинство из них будут совпадать с другими соседними точками, поэтому вашей базовой модели данных не нужно хранить все.
  4. Остерегайтесь информационной перегрузки. Будет ли ваш JTable значимым для пользователя, если он содержит данные на 2 ГБ? Возможно, вам нужно разбивать страницы на страницы и читать только 1000 записей из файла за раз для отображения.
  5. Я не решаюсь предложить это, но во время процесса загрузки вы можете преобразовать CSV-данные в базу данных файлов (например, cdb). Вы можете накапливать статистику и хранить некоторые данные для графика во время преобразования, а также использовать базу данных для быстрого считывания страницы данных одновременно для JTable, как было предложено выше.
Смежные вопросы