2017-02-20 2 views
0

Als Teil des PIG-Skript muss ich das XML, das mit einer UDF generiert wird und XML ist zu groß (etwa 1,5 GB). Derzeit bin ich im folgenden Code XML-StringWie große XML in Zeichenfolge in Java konvertieren

StringWriter sw = new StringWriter(); 
    XMLWriter output = new XMLWriter(sw, xmlFormat); 
    try { 
     output.write(document); 
     output.close(); 
    } catch (IOException e) {} 

    return sw.toString(); 

Dies wirft OutOfMemoryError als String konvertieren wird intern String-Puffer verwendet und es hängt von Arrays.As Arrays ganze Zahl für den Index verwendet und die Länge der XML ist über den int Angebot.

Gibt es eine Möglichkeit, dieses große XML in String zu konvertieren und es an Pig Script zu senden? oder können wir es auf andere Weise erreichen?

FYI - wir verwenden dom4j (org.dom4j.Document) für den Umgang mit XMLs

Update1: habe ich versucht, unter Code, mit dem ich jetzt in der Lage bin 800 MB zu speichern, aber immer noch die Datei, die von 1,5 GB ist versagt

ByteArrayOutputStream result = new ByteArrayOutputStream(); 
    try { 
     XMLWriter output = new XMLWriter(result, xmlFormat); 
     output.write(document); 
     output.close(); 
     return result.toString("UTF-8"); 
    } catch (IOException e) {} 
+1

AFAIK XML ist bereits ein textbasiertes Format, also ist es schon ein String. Ich weiß auch nicht, warum genau du es in String umwandeln willst, vielleicht liegt das Problem an deiner Argumentation. In jedem Fall könnten Sie entweder: 1) der JVM mehr Speicher zuweisen oder 2) eine Datei anstelle eines Strings für die Übertragung verwenden und sie dann am anderen Ende lesen. – m0skit0

Antwort

0

Um zu vermeiden, dass nicht genügend Arbeitsspeicher zur Verfügung steht, müssen Sie Ihre XML-Datei streamen. Sie können dafür den StreamingXMLLoader verwenden, der Ihren XML-Code direkt in Ihrem Pig-Skript streamen und parsen lässt.

Verwandte Themen