Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制Java方法调用的CPU/堆栈?_Java_Nlp_Stanford Nlp - Fatal编程技术网

限制Java方法调用的CPU/堆栈?

限制Java方法调用的CPU/堆栈?,java,nlp,stanford-nlp,Java,Nlp,Stanford Nlp,我正在使用一个NLP库(Stanford NER),它会为罕见的输入文档抛出OOM错误 我计划最终隔离这些文档并找出导致错误的原因,但这很难做到(我在Hadoop中运行,所以我只知道通过split 379/500或类似的方式错误发生率为17%)。作为一个临时解决方案,我希望能够对这个特定调用应用CPU和内存限制 我不知道最好的方法是什么。我的第一个想法是创建一个由一个线程组成的固定线程池,并在将来使用timed get()。这至少会给我一个挂钟限制,这可能会有所帮助 我的问题是,是否有任何方法可

我正在使用一个NLP库(Stanford NER),它会为罕见的输入文档抛出OOM错误

我计划最终隔离这些文档并找出导致错误的原因,但这很难做到(我在Hadoop中运行,所以我只知道通过split 379/500或类似的方式错误发生率为17%)。作为一个临时解决方案,我希望能够对这个特定调用应用CPU和内存限制

我不知道最好的方法是什么。我的第一个想法是创建一个由一个线程组成的固定线程池,并在将来使用timed get()。这至少会给我一个挂钟限制,这可能会有所帮助


我的问题是,是否有任何方法可以通过合理的努力来做得更好。

我不熟悉Hadoop,但不要忘记JVM将有一个隐式的内存上限(如果我的内存正确,服务器为64Mb)。我会检查JVM运行的内存配置(选项)

您可以通过指定内存上限来覆盖它,因此:

java -Xmx512m
把限制设为512Mb

设置CPU分配不在JVM的职权范围之内,并且将是一种特定于操作系统的机制(如果您能够做到的话)


如果您从JVM并行调度这些作业,那么运行单个线程(或有限线程)线程池可能会对您有所帮助。但是(再次)这取决于您的实现,需要更多的细节

如果您所要做的只是找出哪些文档正在崩溃,那么应该在NLP库的调用“即将映射文档x”中添加日志记录。当您看到OOM时,映射程序的日志将包含厄运文档。正如您所说,然后您应该确定该文档的哪些特征导致库崩溃


根据我的经验,尤其是如果这些文档是由互联网上的人创建的,你会在某处发现一些疯狂的巨大文档。在这一点上,你必须决定如何处理这些文件;要么忽略它们,要么截断它们。

只需捕获OutOfMemoryError,记录您使用的文档,然后转到下一个文档。垃圾收集器将确保您有足够的内存用于下一个文档

(如果一个句子太长或太复杂而无法解析,这是我在斯坦福依赖项解析器中使用的策略之一,用于转到下一个句子。)