как мигрировать и обрабатывать данные в Java с нехваткой памяти и быстрее - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть приложение, которое получает файлы с плоской таблицей в DBF, которые нормализуют, конвертируют и вставляют в базу данных MySQL, файлы, размер которых увеличивается от 250 000 до 270 000 записей, и теперь они занимают всего 1,5–2 ГБ. процесс и по частям.

Я проверяю в процессе, если нет предыдущих записей, помогите в HashMaps мне ключи, которые являются уникальными записями, чтобы не сохранять всю информацию в них, проблема здесь в том, что при загрузке файлов в базу данных общих записей DBF данные растут, и каждый раз, когда вы что-то импортируете, становится все медленнее и потребляет гораздо больше памяти, вы легко получаете до 770 000 записей в одной таблице и призыв тратить больше из 2 000 000

пример:

Файл DBF имеет 91 поле, и у меня нормализованная база данных дает 5 основных таблиц, и я должен повторить процесс запоминания DBF 5 раз.

Ничто не может занять около 1 часа, перенести все файлы DBF из 250 000 записей.

Как можно минимизировать время и потребление ОЗУ, если потребление ОЗУ не ниже, а я получаю несколько Exception in thread "main" java.lang.OutOfMemoryError: Java heap space


Структура файла DBF имеет много избыточных данных, как это (столбцы):

  • код опроса
  • общие данные обследования
  • группировка данных в encuenta
  • данные лиц

пример:

| survey_code | survey_columns | group_survey    | more_data | person_details |
|:------------|:---------------|:----------------|:----------|:---------------|
| 1           | ...            | 1               | ...       |1-oscar         |
| 1           | ...            | 1               | ...       |2-juan          |
| 1           | ...            | 2               | ...       |1-catalina      |
| 2           | ...            | 1               | ...       |7-john          |

примечание: Как видите, достаточно избыточности данных

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

Survery (table)
  id
  survey_data

Group_in_survey (table)
  survey_id      
  group_data

Person (table)
  group_id
  person_details   

Процесс импорта, разделенный в соответствии с таблицами и порядком, определяемым их зависимостью, для каждой таблицы проходит через все записи в файле DBF.

Прежде чем сделать запрос на запуск базы данных, а затем загрузить в HashMap информацию, необходимую для выполнения проверки, если записи существуют до добавления в базу данных в MySQL.

Также каждый раз, когда вы добавляете в базу данных MySQL запись, в которую добавляется запись тамибена в HashMap, поскольку один из процессов отладки дублируется. Последнее делается в каждом из процессов

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

Насколько я понимаю, вы сначала вставляете свои записи в HashMap, чтобы избавиться от дубликатов, а затем копируете их в базу данных MySQL.В этом случае вы можете попробовать использовать библиотеку HugeCollections и их HugeMap вместо простого HashMap

0 голосов
/ 30 сентября 2011

Кажется, что вы делаете что-то странное там, похоже, что вы анализируете весь файл dbf, загружаете его в память и затем вставляете один за другим в базу данных (возможно, не создавая соединение каждый раз).

Теперь, насколько я знаю, dbf легко читается потоковыми ридерами, поэтому нет необходимости загружать все в память, я думаю, что было бы лучше сделать это в пакетном режиме, прочитать 100 записей, вставить их все в базу данных, или Вы можете создать файл sql со вставками, а затем запустить весь файл на mysql (но он будет загружен с жесткого диска).

теперь весь процесс должен занимать столько же памяти, сколько обрабатывает одну строку, и это должно быть стабильным.

Мне нужно знать немного больше о структуре файла dbf и ваших таблицах, чтобы сказать что-то еще

0 голосов
/ 30 сентября 2011

Я думаю, что предпочел бы обработать плоский файл, сначала удалить дубликаты и сохранить их во временный файл, а затем выполнить полный массовый импорт. Таким образом, вы никогда не столкнетесь с проблемами памяти, и у вас будет резервная копия вашего первого шага, если возникнут какие-либо проблемы.

...