【问题标题】: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 上的人创建的,您会在某个地方找到一些疯狂的巨大文档。那时您必须决定如何处理这些文件;要么忽略它们,要么截断它们。

        【讨论】:

          猜你喜欢
          • 2011-10-10
          • 1970-01-01
          • 1970-01-01
          • 2015-07-02
          • 1970-01-01
          • 1970-01-01
          • 2010-10-28
          • 2012-07-24
          • 2012-06-30
          相关资源
          最近更新 更多