Scala for-Schleife und Iteratoren

Nehmen wir an ich habe eine sehr große iterierbar Sammlung von Werten (in der Größenordnung von 100.000 String-Einträge Lesen von der Festplatte eins nach dem anderen), und ich mache etwas auf seine kartesischen Produkt (und Schreibe das Ergebnis zurück auf die Festplatte, obwohl ich nicht zeigen, dass hier):

for(v1 <- values; v2 <- values) yield ((v1, v2), 1)

Ich verstehe, dass dies ist nur eine andere Art des Schreibens

values.flatMap(v1 => values.map(v2 => ((v1, v2), 1)))

Diese offenbar bewirkt, dass die gesamte Kollektion für jeden flatMap iteration (oder sogar das gesamte kartesische Produkt?) im Speicher zu behalten. Wenn Sie Lesen, die erste version mit der for-Schleife dies natürlich unnötig. Im Idealfall nur zwei Einträge (die sind zusammen) sollte in Erinnerung bleiben, zu allen Zeiten.

Wenn ich Neuformulierung der ersten version wie folgt:

for(v1 <- values.iterator; v2 <- values.iterator) yield ((v1, v2), 1)

Speicher Verbrauch ist viel geringer, das führt mich zu vermuten, dass diese version muss grundlegend anders. Was genau macht es anders machen, in der zweiten version? Warum Scala nicht implizit verwenden Sie Iteratoren für die erste version? Gibt es eine speedup, wenn Sie nicht mit Iteratoren in einigen Fällen?

Dank! (Und auch Dank der "lmm", antwortete eine frühere version dieser Frage)

  • Wenn Sie die Ausbeute eines ((v1, v2), 1) erstellen Sie eine neue Sammlung, die alle diejenigen Tupel. Also in der Tat das gesamte carthesian Produkt wird in Erinnerung bleiben, nicht?
  • Nicht unbedingt, Sie geschrieben sind, gleich wieder auf die Festplatte (mit spark/HDFS). Sonst wäre es ja nicht skaliert auch gut 🙂
InformationsquelleAutor Johannes | 2014-12-10
Schreibe einen Kommentar