Ich habe ein Stück Code, wenn ich eine Karte erstellen wie:Scala unveränderlich Karte langsam
val map = gtfLineArr(8).split(";").map(_ split "\"").collect { case Array(k, v) => (k, v) }.toMap
Dann habe ich diese Karte verwenden, um meine Aufgabe zu erstellen:
case class MyObject(val attribute1: String, val attribute2: Map[String:String])
Ich lese Millionen Linien und Konvertierung in MyObjects mit einem Iterator. Wie
MyObject("1", map)
Wenn ich es wirklich langsam ist, mehr als 1 Stunde für 2'000'000 Einträge.
Ich entferne die Karte von der Objekterstellung, aber noch kann ich den Split-Prozess (Teil 1):
val map = gtfLineArr(8).split(";").map(_ split "\"").collect { case Array(k, v) => (k, v) }.toMap
MyObject("1", null)
und den Prozess das Skript in weniger als 1 min laufen. für die 2'000'000 Millionen Einträge.
Ich habe etwas Profiling und sieht so aus ist, wenn das Objekt erstellt wird die Zuordnung zwischen val map
auf die Objektkarte macht den Prozess langsam. Was ich vermisse?
-Update das Problem besser erklären:
Wenn Sie meinen Code sehen das mein Selbst Iterierte über 2.000.000 Zeilen an eine interne objet Umwandlung jeder Zeile zu erklären, ich iterieren:
it.map(cretateNewObject).toList
Dieser Iterator durchläuft alle Zeilen und konvertiert sie mit der Funktion createNewObject
in meine Objekte.
Das ist wirklich sehr schnell, speziell mit großen Speicher wie dk14 sagte. Das Performance-Problem ist in meiner
`crateNewObject(val line:String)`
dieser Funktion ein
Objekt erstellen`class MyObject(val attribute1:String, val attribute2:Map[String, String])`
die meine Funktion die Leitung übernehmen und tun erste
`val attributeArr = line.split("\t")`
der erste Attributsatz des Arrays das ist Attribut1 meines Objekts und das zweite Attribut ist
`val map = attributeArr(8).split(";").map(_ split "\"").collect { case Array(k, v) => (k, v) }.toMap`
Wenn ich nur die Anzahl der Elemente in Karte drucken, enden die Programme in 2 min, wenn ich Karte zu meiner neuen Objektlinie MyObject(attribute1, map)
übergebe, ist das Programm wirklich langsam.
Im zweiten Fall verwenden Sie wahrscheinlich 'val map' nicht irgendwo, so dass der Compiler nur den Code in dieser Zeile wegwirft und nichts teilt. – Kolmar
Hi @kolman Das ist nicht der Fall, weil 'gtfLineArr (8) .split ("; "). Map (_ split" \ ""). Collect {case Array (k, v) => (k, v)} .toMap "berechnet den Split und konvertiert das Ergebnis in eine Map. Tatsächlich habe ich' gtfLineArr (8) .split (";"). map (_split "\" "). collect {case Array (k, v) => (k, v)} .toMap.size' und drucke die Ergebnisse und ist eine Minute, die bedeutet, dass die Map erstellt wurde. Meine verdächtige ist, dass, wenn die Karte an das neue Objekt übergeben wird, eine "gewisse" Transformation stattfindet, die das Problem verursacht. – ypriverol
Was macht Ihr Code sonst noch? Die Zeit wird wahrscheinlich nicht in diesen Zeilen verbracht. – Dima