2016-08-16 3 views
0

Da ich xml.gz Datei in Scala zu lesen versucht, erhielt ich folgende Fehlermeldung:Lesen gzipped XML in scala

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence. 
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:701) 
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:567) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1896) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1761) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1799) 
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:156) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327) 
at scala.xml.factory.XMLLoader$class.loadXML(XMLLoader.scala:41) 
at scala.xml.XML$.loadXML(XML.scala:60) 
at scala.xml.factory.XMLLoader$class.loadFile(XMLLoader.scala:50) 
at scala.xml.X 

ich den folgenden Code haben:

import scala.xml.XML 
val xml = XML.loadFile("/home/vagrant/miniprojects/spark/allVotes/part-00380.xml.gz") 

ich mehr haben als 2.000 xml.gz-Dateien einzulesen. Was wäre eine effiziente Lösung dafür? Vielen Dank!!

+0

Zeigen Sie Ihre Arbeit (wie Sie das Parsen tun, und vor allem, wie Sie die gzip Dekompression tun) auf kleinsten vollständig und überprüfbar wäre ein Ort zum Starten. Siehe http://StackOverflow.com/Help/Mcve –

+0

... also * du * tust * überhaupt keine gzip Dekompression. Wie ist es eine Überraschung, dass Sie eine gzip-Datei nicht wie eine XML-Datei lesen können? –

+0

Danke für die Erinnerung. Als ich die Datei gzipip, nimmt es zu viel Speicher ... – achimneyswallow

Antwort

1

.xml.gz ist nicht XML auf der äußeren Ebene - es ist gzip. Verwenden Sie einen GZIPInputStream diese zu dekomprimieren, wie es gelesen hat wird:

import java.io.FileInputStream 
import java.util.zip.GZIPInputStream 
import scala.xml.XML 

def loadXmlGz(filename : String) = { 
    XML.load(new GZIPInputStream(new FileInputStream(new java.io.File(filename)))) 
} 

var xml = loadXmlGz("/home/vagrant/miniprojects/spark/allVotes/part-00380.xml.gz") 
+0

Vielen Dank. Das hilft sehr. – achimneyswallow

+0

Danke, aber ich bin ziemlich naiv. Wenn ich diesen Code verwende, erhalte ich immer noch Speicherfehler, indem ich nur eine .xml.gz-Datei importiere. 'scala> var xml = loadXmlGz ("/home/vagrant/miniprojekte/spark/allVotes/part-00000.xml.gz ") java.lang.OutOfMemoryError: GC-Overhead-Limit überschritten" – achimneyswallow

+0

Wenn Sie nicht genügend Speicher haben Um eine DOM-Struktur für Ihre XML-Dokumente zu speichern, müssen Sie entweder Ihrer JVM mehr Speicher zur Verfügung stellen oder Ihren Code neu schreiben, um kein DOM-basiertes Modell zu verwenden. Siehe http://stackoverflow.com/questions/13184212/parsing-yy-large-xml-lazily für ein Beispiel, wie das gemacht werden könnte. –