0

私はこの方法を持っています:

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マップが内部にあることです。ReportDataHelperflatten.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です。

4

0 に答える 0