我有一個巨大的XML文件(15 GB)。我想將XML文件中的「文本」標籤轉換爲單個頁面。巨大的XML文件到文本文件
示例XML文件:
<root>
<page>
<id> 1 </id>
<text>
.... 1000 to 50000 lines of text
</text>
</page>
... Like wise 2 Million `page` tags
</root>
我最初使用DOM解析器,但它MEMORY(有效),將引發JAVA OUT。現在,我已經使用STAX編寫了JAVA代碼。它運作良好,但表現非常慢。
這是我寫的代碼:
XMLEventReader xMLEventReader = XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(filePath));
while(xMLEventReader.hasNext()){
xmlEvent = xMLEventReader.nextEvent();
switch(xmlEvent.getEventType()){
case XMLStreamConstants.START_ELEMENT:
if(element == "text")
isText = true;
break;
case XMLStreamConstants.CHARACTERS:
chars = (Characters) xmlEvent;
if(! (chars.isWhiteSpace() || chars.isIgnorableWhiteSpace()))
if(isText)
pageContent += chars.getData() + '\n';
break;
case XMLStreamConstants.END_ELEMENT:
String elementEnd = (((EndElement) xmlEvent).getName()).getLocalPart();
if(elementEnd == "text")
{
createFile(id, pageContent);
pageContent = "";
isText = false;
}
break;
}
}
此代碼工作良好(忽略任何小錯誤)。根據我的理解,XMLStreamConstants.CHARACTERS迭代每個文本標籤的行。如果TEXT標籤中有10000行,則XMLStreamConstants.CHARACTERS會迭代接下來的10000行。有沒有更好的方法來提高性能..?
出於好奇,目前需要多長時間才能加載和解析該文件? –
我已解析2GB文件。花了35分鐘.. – user1919035
什麼是'pageContent'?它是一個「字符串」嗎?如果是這樣,一個簡單的優化就可以使用'StringBuilder'來代替;它可以追加字符串,而不必像字符串''''='那樣創建全新的字符串副本(如果你有一個長度的概念,你也可以用一個初始的保留容量來構造它來減少內存重新分配和副本首先)。 –