WedX - журнал о программировании и компьютерных науках

Чтение большого файла и сохранение этих записей для обработки

Это может быть повторяющийся вопрос, так как мы можем найти много страниц. Но все же мне нужно несколько экспертных мнений.

Мне нужно прочитать большой файл, содержащий имя клиента, возраст, доход.

Мне нужно быстро обработать эти данные в моем приложении и создать панель мониторинга, например, сотрудников одного возраста, группы доходов (между диапазонами) ... Теперь задача состоит в том, чтобы прочитать большой файл (явно я установил свою программную кучу на 512 МБ) и использовал Классы InputStream, Scanner (насколько я понимаю, эти классы не будут загружать весь файл в память, пожалуйста, поправьте меня, если я ошибаюсь). поэтому я могу прочитать файл с 7590912 записями (файл 250 МБ). но при установке этих записей в моем arrayList <Employee> отображаются непрерывные всплески и активность сборщика мусора (что ожидается). теперь, чтобы уменьшить объект «Сотрудник», я создал только три поля [имя (char []), возраст [int], доход [float]).

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

РЕДАКТИРОВАТЬ. Использование базы данных H2 для очистки прочитанных данных из файла. создал пакет из 10000 записей (все еще память 512 МБ) ..но программа ужасно медленная. но удается жить некоторое время (до 300 тыс. записей) .. (используемое пространство 470 МБ).

педантичный


  • Нужно ли хранить все данные в памяти или можно обрабатывать как поток? Например, я не понимаю, какие сотрудники одного возраста будут иметь на выходе... Или это тоже зависит от диапазона? Если да, то известны ли диапазоны в начале? 16.12.2015

Ответы:


1

Когда вы читаете запись или некоторое количество записей, вам нужно записать их куда-нибудь, например в базу данных, чтобы они не оставались в памяти. Несмотря на то, что сканер или что-то еще, что вы используете, не заставляет значения оставаться в памяти, если вы сохраняете их в списке, они будут, потому что они будут в вашем списке. Фреймворк Spring Batch идеально подходит для решения этой проблемы.

Если вы не хотите включать фреймворк, вам придется самостоятельно выполнять много сантехнических работ. Я рекомендую прочитать, скажем, 1000 записей, а затем записать их. Очистите свой список, затем прочитайте следующие 1000. Сделайте количество записей, которые нужно читать за раз, переменной, чтобы вы могли играть с разными значениями. Spring Bat называет это блоком.

12.12.2015
  • Спасибо за ваш ответ. Только что я снова проверил ... и нашел ваши комментарии правильными ... мой список съедает всю память ... Я также заменил стратегию чтения на Java8 Stream readLine .... Позвольте мне попытаться сохранить его в базе данных после партии ... 12.12.2015

  • 2

    Я предлагаю вам использовать базу данных Hyper-Sql. Hyper-Sql написан на Java. Он предлагает небольшой, быстрый многопоточный и транзакционный механизм базы данных с таблицами в памяти и на диске и поддерживает встроенный и серверный режимы. В встроенном режиме ему не требуется работающий сервер, и поэтому его можно легко связать с любым Java-приложением, поскольку он состоит всего из трех файлов. Используя драйвер JDBC, вы можете легко подключиться к базе данных и пользоваться мощным языком SQL.

    12.12.2015
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]