Scala 上游速度非常快,然后是下游速度非常慢和内存不足问题

Scala 上游速度非常快,然后是下游速度非常慢和内存不足问题,scala,playframework,akka,slick,Scala,Playframework,Akka,Slick,我一直在把我从摆弄akka溪流中获得的经验提升到实用的水平,我遇到了麻烦。 下面是我尝试编写的流式管道,它从一个非常大的数据库表中读取特定的行,然后对每一行发送一个http调用到外部web服务,然后将收到的响应插入到另一个表中: (数据库库是slick,http客户端是play framework的) val query=(CatalogIndexes与((i,s)=>i.productId==s.icecatId)过滤器(t=>t._2.isEmpty)映射(_._1))上的左CatalogS

我一直在把我从摆弄akka溪流中获得的经验提升到实用的水平,我遇到了麻烦。 下面是我尝试编写的流式管道,它从一个非常大的数据库表中读取特定的行,然后对每一行发送一个http调用到外部web服务,然后将收到的响应插入到另一个表中:

(数据库库是
slick
,http客户端是play framework的)

val query=(CatalogIndexes与((i,s)=>i.productId==s.icecatId)过滤器(t=>t._2.isEmpty)映射(_._1))上的左CatalogSummaries。结果
val source=source.fromPublisher(db.stream(查询))
来源
.缓冲器(5,溢流策略背压)
.mapsync(5){i=>
fetchCatalog(i.productId、Languages.en、icecatService.Contents.all)
}
.map{r=>
为了{
g db.run(目录summeries++=s))
我可以看出,作为上游的db非常快,而那些web服务调用非常慢。另外,如果我将
mapsync
方法的并行数进一步增加,我的所有时间都会超时。 当我将整个项目平台从一个流浪的虚拟机迁移到我的windows 10时,我的问题就开始了。现在我代码中的每一项都运行得快得多,但这段流式处理总是导致GC错误或内存不足错误等等。回到虚拟机,我曾经让这段代码保持运行,并成功地流式处理了40次00结果。我应该如何调整此代码以使其执行

编辑:我还必须指出,在我的windows计算机上,在所有行都因故障而关闭之前,绝对不会插入任何行

编辑:我收到许多类型的错误,但这里有一个常见的错误:

[ERROR] [SECURITY][09/27/2017 07:23:33.046] [application-scheduler-1] 
[akka.actor.ActorSystemImpl(application)] Uncaught error from thread 
[application-scheduler-1]: GC overhead limit exceeded, shutting down 
ActorSystem[application]
java.lang.OutOfMemoryError: GC overhead limit exceeded
    at akka.dispatch.AbstractNodeQueue.<init>(AbstractNodeQueue.java:32)
    at akka.actor.LightArrayRevolverScheduler$TaskQueue.<init (LightArrayRevolverScheduler.scala:304)
    at akka.actor.LightArrayRevolverScheduler$$anon$4.nextTick(LightArrayRevolverScheduler.scala:269)
    at akka.actor.LightArrayRevolverScheduler$$anon$4.run(LightArrayRevolverScheduler.scala:235)
    at java.lang.Thread.run(Thread.java:748)
[ERROR][SECURITY][09/27/2017 07:23:33.046][application-scheduler-1]
[akka.actor.ActorSystemImpl(应用程序)]来自线程的未捕获错误
[application-scheduler-1]:超出GC开销限制,正在关闭
ActorSystem[应用程序]
java.lang.OutOfMemoryError:超出GC开销限制
在akka.dispatch.AbstractNodeQueue。(AbstractNodeQueue.java:32)

在akka.actor.LightArrayRevolversScheduler$TaskQueue上。不确定这是否是原因,但您的插入步骤正在异步运行,没有对流产生任何反压力。您可以尝试将最后一个插入步骤从
.runForeach
更改为
.mapsync(x)(s=>db.run(…).runWith(Sink.ignore())
请看。@PH88我按你说的做了,现在不是GC错误和系统关闭,而是每隔一段时间在游戏控制台上显示一次此消息:
[warn]c.z.h.p.HikariPool-db-检测到线程不足或时钟跳变(housekeeper delta=2m32s834ms149╡s739ns)
我不熟悉
slick
,但是从错误消息中,db insert步骤可能是我的第一个怀疑。您可以通过插入一些虚假数据来隔离和确认,并查看(即Source.tick(x,y,someFakeJson).map(r=>…).collect(…).grouped(100).mapsync(x)(s=>db.run(/*insert*/).runWith(Sink.ignore())`另请参见。当系统抱怨线程不足时,您可以尝试将插入步骤的并行度设置为1(即mapAsync(1)(s=>db.run(…)),请参见。@PH88将并行度设置为1。