MarkLogic - ошибка пространства кучи Java при импорте с mlcp
Marklogic версия: 9.0-6.2 mlcp версия: 9.0.6
Я пытаюсь импортировать XML-файл в marklogic, используя приведенный ниже код MLCP.
#!/bin/bash
mlcp.sh import -ssl \
-host localhost \
-port 8010 \
-username uname \
-password pword \
-mode local \
-input_file_path /data/testsource/*.XML \
-input_file_type documents \
-aggregate_record_namespace "http://new.webservice.namespace" \
-output_collections testcol \
-output_uri_prefix /testuri/ \
-transform_module /ext/ingesttransform.sjs
Код успешно работает с небольшим файлом, но выдает ошибку "java heap space" при запуске с большим файлом (450 МБ).
ERROR contentpump.MultithreadedMapper: Error closing writer: Java heap space
Как мы можем решить эту ошибку?
2 ответа
Задание mlcp предназначено для отправки всего входного файла в виде одного документа (документы -input_file_type) размером 500 МБ в модуль преобразования. Модуль преобразования имеет логику для разбивки значений и значений (content.uri и content.value) для каждого агрегатного элемента. Это приводит к ошибке пространства кучи Java, хотя доступное пространство кучи на сервере составляет около 3,4 ГБ.
Я попробовал два разных дизайна, которые работают.
- Добавьте агрегацию в mlcp (-input_file_type aggregates, -aggregate_record_element CustId) для разделения на несколько документов. Это создает несколько документов в промежуточной БД
- сохраните -input_file_type в качестве документов и удалите -transform_module, чтобы файл загружался как один отдельный документ в промежуточную.
Оба подхода работают, но второй подход может создавать документы размером 500 МБ (я считаю, что ограничение размера составляет 512 МБ). Поэтому я решил использовать первый подход (также мне нужен лучший URI, чем по умолчанию, созданный mlcp).
Вы можете передать настройки кучи Java в MLCP, используя JVM_OPTS
переменная окружения. Бежать java -X
чтобы увидеть список всех доступных опций. Я обычно использую это:
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
Вы можете вызвать свой скрипт или MLCP следующим образом:
JVM_OPTS="-Xmx1g" mlcp.sh ...
НТН!
Чтобы уточнить загрузку одного большого документа по сравнению с множеством документов - это будет зависеть от вашего ввода. Если ваш входной файл представляет собой один большой документ, он будет загружен без разделения, если вы не укажете элемент / свойство XML или JSON для разделения. Например, файл phoneBook.xml со 100000 записей или большой массив JSON phone: [] следует разделить.
Однако, если ваш документ уже разделен на множество записей (обычно CSV или другие текстовые форматы), вам не нужно указывать, как его разделить, потому что формат использует символы новой строки для разделения записей, и mlcp это знает.