2017-02-20 27 views
0

В рамках скрипта PIG мне нужно получить XML, который создается с помощью UDF, а XML слишком большой (около 1,5 ГБ). В настоящее время я использую ниже код для преобразования XML в строкуКак преобразовать большой XML в строку в java

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

    return sw.toString(); 

Это бросает OutOfMemoryError как StringWriter использует буфер строки внутри, и это зависит от Arrays.As Массивы использует целое число для индекса и длины XML выходит за рамки межд ассортимент.

Есть ли способ конвертировать этот большой xml в String и отправить его обратно в скрипт свиньи? или мы можем достичь этого любым другим способом.

FYI - мы используем dom4j (org.dom4j.Document) для обработки XMLs

Update1: Я попытался ниже код, с которым я теперь в состоянии хранить 800 МБ, но по-прежнему файл, который 1,5 ГБ не удается

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 уже является текстовым форматом, поэтому он уже фактически является строкой. Также я не знаю, почему именно вы хотите преобразовать его в String, может быть, проблема кроется в ваших рассуждениях. В любом случае вы можете: 1) выделить больше памяти JVM или 2) использовать файл вместо String для передачи, а затем прочитать его на другом конце. – m0skit0

ответ

0

Чтобы избежать нехватки памяти, вам необходимо передать свой XML-файл. Вы можете использовать для этого StreamingXMLLoader этот поток и проанализировать свой XML непосредственно в сценарии Pig.