Gibt es eine einfache Möglichkeit, Scala Parallelsammlungen zu verwenden, ohne eine vollständige Sammlung in den Speicher zu laden?Parallelsammlung Verarbeitung von Daten größer als Speichergröße
Zum Beispiel habe ich eine große Sammlung und ich möchte eine bestimmte Operation (falten) parallel nur auf einem kleinen Stück, das in den Speicher passt, als auf einem anderen Stück und so weiter, und schließlich rekombinieren Ergebnisse aus alle Stücke.
Ich weiß, dass Schauspieler verwendet werden könnten, aber es wäre wirklich nett, Par-Sammlungen zu verwenden.
Ich habe eine Lösung geschrieben, aber es ist nicht schön:
def split[A](list: Iterable[A], chunkSize: Int): Iterable[Iterable[A]] = {
new Iterator[Iterable[A]] {
var rest = list
def hasNext = !rest.isEmpty
def next = {
val chunk = rest.take(chunkSize)
rest = rest.drop(chunkSize)
chunk
}
}.toIterable
}
def foldPar[A](acc: A)(list: Iterable[A], chunkSize: Int, combine: ((A, A) => A)): A = {
val chunks: Iterable[Iterable[A]] = split(list, chunkSize)
def combineChunk: ((A,Iterable[A]) => A) = { case (res, entries) => entries.par.fold(res)(combine) }
chunks.foldLeft(acc)(combineChunk)
}
val chunkSize = 10000000
val x = 1 to chunkSize*10
def sum: ((Int,Int) => Int) = {case (acc,n) => acc + n }
foldPar(0)(x,chunkSize,sum)
Ich würde sagen, dass hier richtig Berechnungsmodell * Karte reduzieren * sein wird (und somit könnte es sein [Funken] (http://spark-project.org/examples/)), nicht Schauspieler an sich. –
Formal - ja, aber die Verarbeitungszeit ist in diesem Fall nicht sinnvoll, also ist es völlig in Ordnung, auf einer einzigen Maschine zu laufen. –