2011-06-28 6 views
2

私のような10の000 000ノードとテスト用のファイルを作成しようとしました:ノード(10万円)の数が多いXMLファイルを作成します

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
      .newInstance(); 
    DocumentBuilder documentBuilder = documentBuilderFactory 
      .newDocumentBuilder(); 
    Document document = documentBuilder.newDocument(); 
    Element rootElement = document.createElement("root"); 
    document.appendChild(rootElement); 
    for (int i = 1; i <= 10000000; i++) { 
     Element em = document.createElement("ch"); 
     em.appendChild(document.createTextNode("ch_data")); 
     rootElement.appendChild(em); 
    } 
    TransformerFactory transformerFactory = TransformerFactory 
      .newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    DOMSource source = new DOMSource(document); 
    StreamResult result = new StreamResult(new File("c:/file1.xml")); 
    transformer.transform(source, result); 

しかし、エラーを受け取った:

 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl. 
createElement(CoreDocumentImpl.java:620) 
    at main.CreatXMLFile.main(CreatXMLFile.java:27) 

が存在しますかJavaで10 000 000以上のノードを持つXMLファイルを作成するための別のライブラリですか?

+0

なぜこのような大量のXMLファイルを作成したいのですか?各ノードが約60バイトとして保存されていると仮定すると、このファイルは600MB以上になります(バイナリMiBではなくデシマルMBです)。これはフラットファイルのサイズが大きいためです。このファイルに何かを保存するつもりなら、データベースはより良い解決策にはなりませんか? –

答えて

4

:任意のDOMやStAXのを使用せずに、XMLファイルを作成することを検討して:

writeToFile("<root>\n"); 
for (int i = 0; i < 10000000; i++) { 
    writeToFile("<ch>" + getData(i) + "</ch>\n"); 
} 
writeToFile("</root>\n"); 

すべてです - あなただけの文字列をファイルに書き込み方法が必要になります。テキストデータを取得する方法。

+0

問題を解決する最善の方法。ありがとうアンドレアス –

5

StAXを使用してXMLをストリームとして書き込むことで、ドキュメント全体をメモリに保存する必要がなくなります。

0

JVMに割り当てられたメモリを増やすことがあります。

しかし、なぜファイル全体をメモリに保存する必要がありますか?それには本当に良い理由がない場合、あなたはそれをするべきではありません。あなたがSAX parserまたはJDOM

DOMパーサを使用して試みることができる

1

はXML data.In SAXのイベントベースのシステムの階層構造に基づいて、内部ツリーを作成し、パーサは、文書の任意の内部表現を作成しません。 。代わりに、特定のイベント(SAX仕様で定義されている)が発生すると、パーサはハンドラ関数を呼び出します。これらのイベントには、ドキュメントの開始と終了、テキストノードの検索、子要素の検索、不正な要素のヒットなどがあります。

巨大なXMLドキュメントを解析して処理する必要がある場合、SAX実装はDOMベースのものよりも多くの利点を提供します。

0

JVMのメモリサイズを増やすことで試すことができます。

java.youでxmlファイルを作成する方法はいくつかありますが、次のリンクからいくつかの例を見つけることができます。

そのような些細なファイルの場合

http://www.javazoom.net/services/newsletter/xmlgeneration.html

関連する問題