1

我正在使用一个 NLP 库 (Stanford NER),它会java.lang.OutOfMemoryError为罕见的输入文档引发错误。

我计划最终隔离这些文档并找出它们导致错误的原因,但这很难做到(我在 Hadoop 中运行,所以我只知道错误发生 17% 通过拆分 379/500 或类似的东西) . 作为临时解决方案,我希望能够对这个特定调用应用 CPU 和内存限制。我不确定最好的方法是什么。我的第一个想法是创建一个线程的固定线程池,并在 Future 上使用定时 get()。这至少会给我一个挂钟限制,这可能会有所帮助。

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

4

3 回答 3

2

我不熟悉 Hadoop,但不要忘记您的 JVM 将对其施加隐式的上内存边界(如果我的记忆正确,服务器为 64Mb)。我会检查您的 JVM 正在运行的内存配置(此处的选项)

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

java -Xmx512m

(比如说)将限制设置为 512Mb。

设置 CPU 分配超出了 JVM 的职权范围,并且将是特定于操作系统的机制(如果你能做到的话)

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

于 2009-07-04T09:38:52.223 回答
1

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

(如果一个句子太长或太复杂而无法解析,这是我与斯坦福依赖解析器一起使用的策略之一。)

于 2009-11-11T20:42:28.493 回答
0

如果您要做的只是找出哪些文档正在崩溃,您应该记录对 NLP 库的调用,“即将映射文档 x”。当您看到 OOM 时,映射器的日志将包含厄运的文档。就像您说的那样,您应该确定该文档的哪些特征导致库崩溃。

根据我的经验,尤其是如果文档是由 Internet 上的人创建的,您会在某个地方找到一些疯狂的巨大文档。那时您必须决定如何处理这些文件;要么忽略它们,要么截断它们。

于 2009-07-04T17:29:12.897 回答