【问题标题】:Limit CPU / Stack for Java method call?限制 Java 方法调用的 CPU / 堆栈?
【发布时间】:2009-07-04 04:09:10
【问题描述】:
我正在使用一个 NLP 库 (Stanford NER),它会针对稀有的输入文档引发 java.lang.OutOfMemoryError 错误。
我计划最终隔离这些文档并找出它们导致错误的原因,但这很难做到(我在 Hadoop 中运行,所以我只知道通过拆分 379/500 或其他方式会发生 17% 的错误像那样)。作为临时解决方案,我希望能够对这个特定调用应用 CPU 和内存限制。我不确定最好的方法是什么。我的第一个想法是创建一个线程的固定线程池,并在 Future 上使用定时 get()。这至少会给我一个挂钟限制,这可能会有所帮助。
我的问题是,是否有任何方法可以通过合理的努力做得比这更好。
【问题讨论】:
标签:
java
nlp
stanford-nlp
【解决方案1】:
我不熟悉 Hadoop,但不要忘记您的 JVM 将对其施加隐式的内存上限(如果我的记忆正确,服务器为 64Mb)。我会检查你的 JVM 运行的内存配置(选项here)
您可以通过指定内存上限来覆盖它:
java -Xmx512m
(比如说)将限制设置为 512Mb。
设置 CPU 分配超出了 JVM 的职权范围,并且将是一种特定于操作系统的机制(如果你能做到的话)
如果您从 JVM 并行分派这些作业,那么运行单线程(或有限线程)线程池可能会对您有所帮助。但是(再次)这取决于您的实现,需要更多细节。
【解决方案2】:
只需捕获 OutOfMemoryError,记录您所在的文档,然后继续下一个。垃圾收集器将确保您有足够的内存用于下一个文档。
(如果一个句子太长或太复杂而无法解析,这是我与斯坦福依赖解析器一起使用的策略之一。)
【解决方案3】:
如果您只想找出哪些文档正在崩溃,您应该记录对 NLP 库的调用,“即将映射文档 x”。当您看到 OOM 时,映射器的日志将包含厄运的文档。正如您所说,您应该确定该文档的哪些特征导致库崩溃。
根据我的经验,尤其是如果文档是由 Internet 上的人创建的,您会在某个地方找到一些疯狂的巨大文档。那时您必须决定如何处理这些文件;要么忽略它们,要么截断它们。