私はこの方法を持っています:
val reportsWithCalculatedUsage = time("Calculate USAGE") {
reportsHavingCalculatedCounter.flatten.flatten.toList.groupBy(_._2.product).mapValues(_.map(_._2)) mapValues { list =>
list.foldLeft(List[ReportDataHelper]()) {
case (Nil, head) =>
List(head)
case (tail, head) =>
val previous = tail.head
val current = head copy (
usage = if (head.machine == previous.machine) head.counter - previous.counter else head.usage)
current :: tail
} reverse
}
}
のタイプreportsHavingCalculatedCounter
は次のとおりval reportsHavingCalculatedCounter:
scala.collection.immutable.Iterable[scala.collection.immutable.IndexedSeq[scala.collection.immutable.Map[Strin
g,com.agilexs.machinexs.logic.ReportDataHelper]]]
です。
このコードは完全に機能します。問題は、オブジェクト (マップ値) の合計が約 50 000 エントリであり、処理に約 15 秒かかるreportsHavingCalculatedCounter
マップが内部にあることです。ReportDataHelper
flatten.flatten
2つのフラットマップでも試しましたが、ほぼ同じです(時間がかかります)。これを改善する方法はありますか?(無視してください。foldLeft
またはreverse
、問題がまだ存在することを削除した場合、最も時間がかかるのはそれら 2flatten
です)。
更新:別のシナリオで試しました:
val reportsHavingCalculatedCounter2: Seq[ReportDataHelper] = time("Counter2") {
val builder = new ArrayBuffer[ReportDataHelper](50000)
var c = 0
reportsHavingCalculatedCounter.foreach { v =>
v.foreach { v =>
v.values.foreach { v =>
c += 1
builder += v
}
}
}
println("Count:" + c)
builder.result
}
そして、次のものが必要ですCounter2 (15.075s)
。
scalaが遅いとは想像できません。これは最も遅い部分v.values.foreach
です。