MarkLogic - 使用 mlcp 导入时 java 堆 space 错误
MarkLogic - java heap space error while importing with mlcp
Marklogic 版本:9.0-6.2
mlcp 版本:9.0.6
我正在尝试使用下面的代码使用 MLCP uisng 将 XML 文件导入 marklogic。
#!/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
代码 运行使用小文件成功,但 运行 使用大文件 (450 MB) 时出现 'java heap space' 错误。
ERROR contentpump.MultithreadedMapper: Error closing writer: Java heap space
我们如何解决这个错误?
您可以使用典型的 JVM_OPTS
环境变量将 Java 堆设置传递给 MLCP。 运行 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 ...
HTH!
mlcp 作业旨在将整个输入文件作为一个大小为 500 MB 的文档(-input_file_type 个文档)发送到转换模块中。转换模块具有为每个聚合元素吐出 uris 和值(content.uri 和 content.value)的逻辑。这会导致 java 堆 space 错误,即使服务器上可用的堆 space 约为 3.4 GB。
我尝试了两种有效的不同设计。
- 在mlcp中添加聚合(-input_file_type聚合,-aggregate_record_elementCustId)吐入多个文档。这会在暂存数据库中创建多个文档
- 将 -input_file_type 保留为文档并删除 -transform_module,因此文件将作为单个文档加载到暂存中。
这两种方法都有效,但第二种方法可能会创建大小为 500 MB 的文档(我认为大小限制为 512 MB)。所以我选择使用第一种方法(另外,我需要一个比 mlcp 默认创建的更好的 uri)。
阐明加载单个大型文档还是加载多个文档 - 这将取决于您的输入。如果您的输入文件是一个大文档,它将在不拆分的情况下加载,除非您指定 XML 或 JSON element/property 作为拆分依据。例如,一个包含 100,000 个条目的 phoneBook.xml 或一个大 phone: [ ] JSON 数组应该拆分。
但是,如果您的文档已经拆分成许多记录(通常是 CSV 或其他文本格式),那么您不需要指定如何拆分它,因为该格式使用换行符来分隔记录并且 mlcp 知道这一点.
Marklogic 版本:9.0-6.2 mlcp 版本:9.0.6
我正在尝试使用下面的代码使用 MLCP uisng 将 XML 文件导入 marklogic。
#!/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
代码 运行使用小文件成功,但 运行 使用大文件 (450 MB) 时出现 'java heap space' 错误。
ERROR contentpump.MultithreadedMapper: Error closing writer: Java heap space
我们如何解决这个错误?
您可以使用典型的 JVM_OPTS
环境变量将 Java 堆设置传递给 MLCP。 运行 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 ...
HTH!
mlcp 作业旨在将整个输入文件作为一个大小为 500 MB 的文档(-input_file_type 个文档)发送到转换模块中。转换模块具有为每个聚合元素吐出 uris 和值(content.uri 和 content.value)的逻辑。这会导致 java 堆 space 错误,即使服务器上可用的堆 space 约为 3.4 GB。
我尝试了两种有效的不同设计。
- 在mlcp中添加聚合(-input_file_type聚合,-aggregate_record_elementCustId)吐入多个文档。这会在暂存数据库中创建多个文档
- 将 -input_file_type 保留为文档并删除 -transform_module,因此文件将作为单个文档加载到暂存中。
这两种方法都有效,但第二种方法可能会创建大小为 500 MB 的文档(我认为大小限制为 512 MB)。所以我选择使用第一种方法(另外,我需要一个比 mlcp 默认创建的更好的 uri)。
阐明加载单个大型文档还是加载多个文档 - 这将取决于您的输入。如果您的输入文件是一个大文档,它将在不拆分的情况下加载,除非您指定 XML 或 JSON element/property 作为拆分依据。例如,一个包含 100,000 个条目的 phoneBook.xml 或一个大 phone: [ ] JSON 数组应该拆分。
但是,如果您的文档已经拆分成许多记录(通常是 CSV 或其他文本格式),那么您不需要指定如何拆分它,因为该格式使用换行符来分隔记录并且 mlcp 知道这一点.