我们java.lang.OutOfMemoryError: Java heap space
在运行 MetaMap(使用 Java API 和 UIMA 包装器)时不断遇到错误。
不幸的是,日志的信息量并不大,所以我们不知道它在哪个文件上呕吐。
过去,当 MetaMap 遇到管道 ( |
) 符号时,我们遇到过创建巨大圆形注释的问题。但是,我们使用的文件集(MIMIC 注释)不包含任何管道符号。是否有其他字符可能表现出与管道符号类似的行为?
我们可以增加系统 RAM 来规避堆空间问题(实际上无法使用最大设置堆,设置为 6 GB,因为系统 RAM 是有限的),但我们更想知道是什么导致了问题,尤其是从那时起,输出文件的大小更易于管理。
* 编辑 *
澄清一下:我们增加了 JVM 的内存资源,这确实有助于实际推送数据(这是在本地 VM 上测试的)。MetaMap 的问题在于它创建了大量的循环注释,这些注释会占用 JVM 资源(并且在我们当前的系统上,OS RAM 不是最佳的)。
正如我在下面的评论中所指出的,我们对文件进行了预处理,以去除任何会引发错误的字符。不过,堆空间错误有点烦人,因为与我们遇到的其他错误(例如,围绕一个单独句点的空间,如text . text
)不同,这些错误只会抛出一个解析错误以及抛出错误的文本。对于管道符号,我们通过增加 RAM(在我们最初测试的 VM 上)然后查看 UIMA 查看器中的注释来找到它。我们能够识别有问题的文件,因为带有循环注释的 XMI 的输出文件大小非常大。
我们再次在 VM 上运行一些测试以查看我们是否可以识别问题,但是如果有人有 MetaMap 经验来帮助我们识别任何问题字符或字符序列,那将是可取的。
* 编辑 2 *
内存应该不是问题。我们正在使用export JAVA_TOOL_OPTIONS='-Xms2G -Xmx6G -XX:MinHeapFreeRatio=25 -XX:+UseG1GC'
我们正试图解决循环注释的一个基本问题。这是在吞噬资源和呕吐。
解决方案有两个:
有一个需要设置的 UIMA JVM 环境变量,如 export UIMA_JVM_OPTS="-Xms128M -Xmx5g"
其次,有一个 MetaMap 开关,可以减少创建注释的递归深度(在 MetaMapApiAE.xml 配置文件中):
<configurationParameterSettings>
... previous settings omitted ...
<nameValuePair>
<name>metamap_options</name>
<value>
<string>--prune 30</string>
</value>
</nameValuePair>
</configurationParameterSettings>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句