MarkLogic-使用mlcp导入时发生java堆空间错误

MarkLogic-使用mlcp导入时发生java堆空间错误,marklogic,marklogic-9,mlcp,Marklogic,Marklogic 9,Mlcp,Marklogic版本:9.0-6.2 mlcp版本:9.0.6 我正在尝试使用下面的代码将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 \

Marklogic版本:9.0-6.2 mlcp版本:9.0.6

我正在尝试使用下面的代码将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堆空间”错误


如何解决此错误?

您可以使用典型的
JVM\u 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作业旨在将整个输入文件作为一个大小为500 MB的单个文档(-input_file_type documents)发送到转换模块中。转换模块具有为每个聚合元素吐出uri和值(content.uri和content.value)的逻辑。这会导致java堆空间错误,即使服务器上可用的堆空间约为3.4 GB

我尝试了两种不同的设计,都很有效

  • 在mlcp中添加聚合(-input\u file\u type aggregates,-aggregate\u record\u element CustId)以吐入多个文档。这将在暂存数据库中创建多个文档
  • 将-input_file_类型保留为documents并删除-transform_模块,以便将文件作为单个文档加载到staging中

  • 这两种方法都有效,但第二种方法可能会创建大小为500 MB的文档(我相信大小限制是512 MB)。因此,我选择使用第一种方法(同样,我需要一个比mlcp创建的默认uri更好的uri)。

    来阐明如何加载单个大型文档而不是许多文档,这取决于您的输入。如果您的输入文件是一个大文档,则除非指定要拆分的XML或JSON元素/属性,否则将不拆分地加载该文件。例如,一个有100000个条目的phoneBook.xml或一个大电话:[]JSON数组应该被拆分


    但是,如果您的文档已拆分为多个记录(通常为CSV或其他文本格式),则无需指定如何拆分,因为该格式使用换行符分隔记录,mlcp知道这一点。

    非常感谢您的回复。我将该值一直递增到“-Xmx1024g”,但在2秒内仍然失败,出现java堆空间错误。脚本在小文件中运行良好。我们需要任何服务器级别的更改吗?我正在从不同的Linux服务器(不是安装MarkLogic的地方)运行脚本。还有什么我可以尝试的吗?尝试添加
    -thread\u count 1-transaction\u size 1-batch\u size 1
    ,强制MLCP逐个处理文件。它可能试图并行处理几个大文件。如果可行,轻轻地将线程数增加回10,以获得更好的性能,如果仍然有内存,还可以增加批处理大小。此外,我认为您不会有1024g可用内存,所以Java在耗尽所有内存时停止。再次感谢您的快速响应。根据建议的更改,我仍然会收到“线程“main”java.lang.OutOfMemoryError:java堆空间中的异常”错误。听起来有点像它没有拾取内存设置,或者仍然一次执行太多操作。您可能需要记录mlcp.sh正在执行的实际java调用,并检查在“管理ui状态”选项卡或“监视ui”中看到的传入请求的数量。转换方法仍然可以工作,但同样,您可能需要放慢速度。在
    -thread\u count 1
    选项旁边,您还可以尝试使用
    -batch\u size 1
    -transaction\u size 1
        -Xms<size>        set initial Java heap size
        -Xmx<size>        set maximum Java heap size
        -Xss<size>        set java thread stack size
    
    JVM_OPTS="-Xmx1g" mlcp.sh ...