限制Java方法调用的CPU/堆栈?
我正在使用一个NLP库(Stanford NER),它会为罕见的输入文档抛出OOM错误 我计划最终隔离这些文档并找出导致错误的原因,但这很难做到(我在Hadoop中运行,所以我只知道通过split 379/500或类似的方式错误发生率为17%)。作为一个临时解决方案,我希望能够对这个特定调用应用CPU和内存限制 我不知道最好的方法是什么。我的第一个想法是创建一个由一个线程组成的固定线程池,并在将来使用timed get()。这至少会给我一个挂钟限制,这可能会有所帮助限制Java方法调用的CPU/堆栈?,java,nlp,stanford-nlp,Java,Nlp,Stanford Nlp,我正在使用一个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,记录您使用的文档,然后转到下一个文档。垃圾收集器将确保您有足够的内存用于下一个文档 (如果一个句子太长或太复杂而无法解析,这是我在斯坦福依赖项解析器中使用的策略之一,用于转到下一个句子。)