gpt4 book ai didi

java - 修改后的 DeepLearning4Java 出现内存泄漏或拥塞工作线程(使用 akka)

转载 作者:行者123 更新时间:2023-12-01 11:05:52 24 4
gpt4 key购买 nike

我正在使用 DeepLearning4Java 的修改版本,通过 UIMA CollectionReader 来处理文档。对于大型文档集合,我遇到了 GC 开销限制错误或不同类型的超时错误(例如线程“RMI TCP 连接(空闲)”中的异常),因为垃圾收集花费了更多时间。我不确定这是内存泄漏还是我只是在 worker 邮箱中堆积了太多工作。我不熟悉 scala 和 akka,这没有帮助。

发生的情况是,我的应用程序运行良好,直到接近堆限制(尝试使用 4GB 和 8GB),在达到 GC 开销限制之前速度会变慢。这不是 PermGen 空间使用量永远不会超过 45 MB 的问题,也不是创建太多类的问题 - 我只看到过大约 7000 个类的加载,而且在运行时基本上是完全平坦的。

主要的罪魁祸首可以在下面的屏幕截图中看到。 Java Visual VM Screnshot

这些对象在 org.deeplearning4j.bagofwords.vectorizer.BaseTextVectorizer 中使用 vocabActor.tell 进行实例化。

while(docIter != null && docIter.hasNext()) {

vocabActor.tell(new StreamWork(new DefaultInputStreamCreator(docIter),latch),vocabActor);

queued.incrementAndGet();
if(queued.get() % 10000 == 0) {
log.info("Sent " + queued);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}

}

我理解的tell函数是akka中的scala代码

  final def tell(msg: Any, sender: ActorRef): Unit = this.!(msg)(sender)

我的理解是,这会进入工作人员的邮箱等待处理 - 但我认为一旦工作处理完毕,对此的所有引用都会消失。所以我不确定为什么这么多对象被持久化,一定有一些钩子(Hook)阻止 GC 丢弃这些对象 - 也许是因为它们在邮箱中并且还没有被处理?该循环可以运行一段时间,但我假设所有 StreamWork 对象都被回收。

我的问题是,是否有办法确定我是否需要切换到不同类型的调度程序以某种方式限制消息生成,或者我是否应该调查内存泄漏。如果需要,我可以发布 DocumentIterator 或其他代码。

最佳答案

请始终使用 Maven Central 提供的最新 dl4j/nd4j 版本。你所说的错误已经修复了一段时间,而且 Akka 已经不再使用了。

附:目前最新版本是0.4-rc3.8。

关于java - 修改后的 DeepLearning4Java 出现内存泄漏或拥塞工作线程(使用 akka),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32958601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com