我必須將 7 個串列寫入 XML 檔案,每個串列的大小為 1 GB 到 5 GB。
預期的 XML 檔案如下:
<doc>
<items1>
<itemA>..</itemA>
..
</items1>
<items2>
<itemB>..</itemB>
..
</items2>
<items3>
<itemC>..</itemC>
..
</items3>
.
.
.
<items7>
<itemG>..</itemG>
..
</items7>
</doc>
Java物件是這樣的:
List<ItemA> items1 = new List<>(); // 1GB-5GB
List<ItemB> items2 = new List<>(); // 1GB-5GB
List<ItemC> items3 = new List<>(); // 1GB-5GB
List<ItemD> items4 = new List<>(); // 1GB-5GB
List<ItemE> items5 = new List<>(); // 1GB-5GB
List<ItemF> items6 = new List<>(); // 1GB-5GB
List<ItemG> items7 = new List<>(); // 1GB-5GB
將所有串列包裝成一個物件(目錄)到一個 Java 物件中,并且一次編組會消耗大量記憶體,而且每次當這個串列大小增加時,我們都必須擴展我們的基礎設施。下面是代碼:
JAXBContext.newInstance("ta").createMarshaller().marshal(new ObjectFactory().createCatalogue(catalogue), new FileOutputStream(fileName));
這里的目錄是一個包含所有七個串列的 Java 物件。
有沒有什么聰明的方法可以通過分塊寫入資料來減少記憶體消耗。我為此探索了stax,但我找不到寫入資料串列的方法。
Java 中有沒有辦法以有效的方式將多達 20 GB 的資料寫入 XML,而無需在基礎設施上擴展 RAM?
We want to write each list separately, also previously written file should not be load into heap while writing next list.
uj5u.com熱心網友回復:
使用 StAX 很可能是最好的方法,不僅因為您不必將整個 XML 檔案保存在記憶體中,還因為您也不必將所有專案保存在記憶體中。不知道您在哪里尋找使用 StAX 撰寫的內容,但我在The Java EE 5 Tutorial 中找到了以下內容:
以下示例取自 StAX 規范,展示了如何實體化輸出工廠、創建撰寫器和撰寫 XML 輸出:
XMLOutputFactory output = XMLOutputFactory.newInstance(); XMLStreamWriter writer = output.createXMLStreamWriter( ... ); writer.writeStartDocument(); writer.setPrefix("c","http://c"); writer.setDefaultNamespace("http://c"); writer.writeStartElement("http://c","a"); writer.writeAttribute("b","blah"); writer.writeNamespace("c","http://c"); writer.writeDefaultNamespace("http://c"); writer.setPrefix("d","http://c"); writer.writeEmptyElement("http://c","d"); writer.writeAttribute("http://c","chris","fry"); writer.writeNamespace("d","http://c"); writer.writeCharacters("Jean Arp"); writer.writeEndElement(); writer.flush();此代碼生成以下 XML(新行是非規范的):
<?xml version=’1.0’ encoding=’utf-8’?> <a b="blah" xmlns:c="http://c" xmlns="http://c"> <d:d d:chris="fry" xmlns:d="http://c"/> Jean Arp </a>
編輯:我還注意到在您發布的鏈接中有一個關于使用 StAX 生成 XML的部分。另外,請注意“撰寫串列”沒有什么特別之處,您只需遍歷串列并為每個條目撰寫一個標簽。像這樣的東西:
XMLStreamWriter writer = ...;
writer.writeStartDocument();
writer.writeStartElement("doc");
// Write the first list:
writer.writeStartElement("items1");
for (ItemA e: items1) {
writer.writeStartElement("itemA");
// TODO: Write attributes, sub-elements, text or whatever is needed
writer.writeEndElement();
});
writer.writeEndElement();
// TODO: Write items2, items3, ..., items7 in the same fashion as items1
// Close document
writer.writeEndElement();
writer.writeEndDocument();
XMLStreamWriter 是低級的,這意味著除了將 XML 寫入流之外,它不會為您做更多的事情,但它并不復雜。因此,與使用 JAXB 時相比,您最終可能會多出幾行代碼,但是您必須撰寫的代碼不會特別難撰寫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/323951.html
