Meine Funktion ist einfach nimmt eine CSV-Datei, die hochgeladen wurde und einige Formatierungsprobleme und eine andere Funktion aufrufen, um es zu bereinigen und seine Formatierung zu beheben.Ja OutOfMemoryError beim Mappen großer Liste von Tupeln
aber wenn ich meine Reinigungsfunktion mit einer Datei (als String) nennen, die sehr groß ist erhalte ich die Fehlermeldung:
[ERROR] [24/02/2017] [application-scheduler-1] [ActorSystem(application)] Uncaught error from thread [application-scheduler-1] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled java.lang.OutOfMemoryError: GC overhead limit exceeded
dies ist, wo sie versagt:
def clean(fileStr: String): String = {
val zippedWithIndex = fileStr.zipWithIndex
// i need to map it like this for the next stage of my cleaning
val indexCharMap = zippedWithIndex.map(cur => (cur._2,cur._1)).toMap
// my string builder
val builder = new StringBuilder()
...
}
es nicht in die zippedWithIndex.map
da die Datei sehr groß ist (die fileStr.length
ist 10948026)
ich brauche es im iterating auf zippedWithIndex Ursache und ich muss die Fähigkeit zu haben Überprüfen Sie das Zeichen vor und nach (zum Beispiel: indexCharMap.get(chr._2 - 1))
es nur für wie eine Minute denken und dann löst die Ausnahme oben.
was wäre eine bessere Lösung?
Dank (außer Strömen bewegen, dass in der zweiten Version dieses Produkts wäre)!
So, jetzt funktioniert es wie folgt aus:
Ich brauche eine richtige CSV-Datei haben, das ist:
"Header1","Header2","Header3"
"value1","value2","value3"
aber die Datei, die im immer wird aus irgendeinem System bekommen, die ich nicht haben Zugang zu und die Formatierung ist gebrochen, was bedeutet, dass ich eine Datei wie diese bekommen:
"Header1","Header2","Header3"
"val"ue1","val"ue2","val"ue"3"
sein, weil die in den Werten im bekommen können Anführungszeichen und das System sein, dass sie nicht herausnimmt tun richtige Entkommen, die es so aussehen sollte:
"Header1","Header2","Header3"
"val""ue1","val""ue2","val""ue""3"
weil csv-Format in einer Art und Weise funktioniert, dass, wenn Sie ganz im Inneren Wert haben wollen Sie doppelte Anführungszeichen setzen müssen.
so es zu beheben im Iterieren durch zippedWithIndex und die Logik geht so:
zippedWithIndex.foreach(chr => {
builder.append(chr._1)
if(!currentlyInsideValue && begginingOfValue(indexCharMap.get(chr._2 - 1)))
currentlyInsideValue = true
else if (currentlyInsideValue && endingValue(indexCharMap.get(chr._2 + 1)))
currentlyInsideValue = false
else
builder.append('"')
}
Sie müssen uns über weitere Informationen sagen, was wollen Sie für 'indexCharMap' zu tun? – chengpohi
@chengpohi Ich brauche es im iterating auf ZipPedWithIndex und ich muss die Fähigkeit haben, das Zeichen vor und nach zu überprüfen (zum Beispiel: 'indexCharMap.get (chr._2 - 1))' – JohnBigs
val zippedWithIndex = fileStr.zipWithIndex? Wird dadurch nicht für jedes Zeichen in der Eingabezeichenfolge ein Index erstellt? Willst du das wirklich? Ah. Dein Kommentar oben deutet darauf hin, dass du es tust. Ok –