斯卡拉 - 未来"Out of memory"



所以我必须写下面的代码:

case class ResultEntry(destination: String,
from: LocalDate,
to: LocalDate,
data: Data)

val destinations = Seq(
"New York",
"Scranton",
"Stamford",
"Jamaica",
)
val dates = 0.to(30).map(v => LocalDate.of(2021, 1, 1).plusDays(v))
Await.result(
Future
.sequence(for {
destination <- destinations
fromDate <- dates
toDate <- dates if (toDate.isAfter(fromDate))
score = Future(
blocking(
SnelDwight.calculateVacationScore(destination, fromDate, toDate)))
} yield {
score.map { score =>
ResultEntry(destination, fromDate, toDate, score)
}
})
.map { results =>
results.groupBy(_.destination).map {
case (destination, results) =>
val min = results.minBy(_.data.score)
println(s"${destination} : ${min}")
}
},
Duration.Inf
)

此代码将抛出"内存不足";例外。我需要解决这个问题,但要尽可能保持计算的并发性。我怎样才能做到呢?

使用blocking会导致每次都创建一个新线程,而不是使用线程池中的现有线程。这避免了阻塞池中每个线程和阻止新Future运行的危险。

在这个例子中,你创建了将近2000个线程,这很可能导致内存错误。

如果计算不是真的阻塞,那么就删除blocking

如果计算阻塞,那么您需要在单个线程上批量处理多个计算。例如,在一个Future中执行所有的toDates(无论如何,这可能更有效)。

相关内容