3

大規模なデータ移行プロジェクトの可能なソリューションとしてvtd-xmlを評価しています。入力データはxml形式であり、vtd-xmlが実行可能であれば、開発時間を大幅に節約できます。vtd-xml Webサイト( http://vtd-xml.sourceforge.net/codeSample/cs12.html)からサンプルのProcess Huge XML Documents(2GBより大きい)を実行します。

500Mbを正常に処理しましたが、恐ろしいjava.lang.OutOfMemoryError:4GbファイルでのJavaヒープスペースエラーが発生します。

  1. JVM引数:-Xmn100M-Xms500M-Xmx2048M。
  2. JVM引数:-Xmn100M-Xms500M-Xmx4096M。

そしてMavenで:

  1. MAVEN_OPTS = -Xmn100M-Xms500M-Xmx2048Mを設定します
  2. MAVEN_OPTS = -Xmn100M-Xms500M-Xmx4096Mを設定します

注:JVM引数のさまざまな組み合わせでテストしました。

私はvtd-xmlサイトとAPIドキュメントを研究し、ここや他の場所で多くの質問を閲覧しました。すべてのオーナーは、JVMメモリをより高く設定するか、物理メモリを追加することを指します。vtd-xml Webサイトでは、xmlファイルサイズの1.3倍から1.5倍のメモリ使用量について言及していますが、64ビットを使用する場合は、使用可能なメモリよりもはるかに大きなファイルを処理できるはずです。確かに、35Gbxmlファイルを処理するために64Gbメモリを追加することも現実的ではありません。

環境:

Windows764ビット。6GbRAM。(他のすべてのアプリを閉じ、85%のメモリを利用可能)

Javaバージョン「1.7.0_09」

Java(TM)SEランタイム環境(ビルド1.7.0_09-b05)

Java HotSpot(TM)64ビットサーバーVM(ビルド23.5-b02、混合モード)

Eclipse Indigo

Maven 2

EclipseとMavenの両方からサンプルを実行すると、メモリ不足の例外がスローされます。

コード例:

 import com.ximpleware.extended.VTDGenHuge;
 import com.ximpleware.extended.VTDNavHuge;
 import com.ximpleware.extended.XMLMemMappedBuffer;

 public class App {

/* first read is the longer version of loading the XML file */
public static void first_read() throws Exception{
XMLMemMappedBuffer xb = new XMLMemMappedBuffer();
    VTDGenHuge vg = new VTDGenHuge();
    xb.readFile("C:\\Temp\\partial_dbdump.xml");
    vg.setDoc(xb);
    vg.parse(true);
    VTDNavHuge vn = vg.getNav();
    System.out.println("text data ===>" + vn.toString(vn.getText()));
}   

/* second read is the shorter version of loading the XML file */
public static void second_read() throws Exception{
    VTDGenHuge vg = new VTDGenHuge();
    if (vg.parseFile("C:\\Temp\\partial_dbdump.xml",true,VTDGenHuge.MEM_MAPPED)){
        VTDNavHuge vn = vg.getNav();
        System.out.println("text data ===>" + vn.toString(vn.getText()));
    }
}

public static void main(String[] s) throws Exception{
    first_read();
    //second_read();
}

}

エラー:

 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.ximpleware.extended.FastLongBuffer.append(FastLongBuffer.java:209)
at com.ximpleware.extended.VTDGenHuge.writeVTD(VTDGenHuge.java:3389)
at com.ximpleware.extended.VTDGenHuge.parse(VTDGenHuge.java:1653)
at com.epiuse.dbload.App.first_read(App.java:14)
at com.epiuse.dbload.App.main(App.java:29)

どんな助けでもいただければ幸いです。

4

2 に答える 2

3

Javaに最大ヒープサイズが2GBであることを伝えてから、4GBの大きさのXMLファイルを処理するように要求しています。

この作業を行う機会を得るには、処理しようとしているファイルのサイズよりも大きい最大ヒープを定義する必要があります。または、処理メカニズムを、メモリ内のファイル全体を必要としないものに変更する必要があります。同時に。

彼らのウェブサイトから、

世界で最もメモリ効率の高い(XMLドキュメントの1.3x〜1.5xサイズ)ランダムアクセスXMLパーサー。

これは、アプリが他にメモリを必要としないと仮定すると、4GBのファイルの場合は最大ヒープサイズが約6GB必要であることを意味します。

次のJVM引数を試してください。

-Xmn100M -Xms2G -Xmx6G

それでもメモリが不足する可能性がありますが、少なくとも今はチャンスがあります。

そうそう、OSがJavaに要求するメモリを提供できないため、Javaの起動に失敗する場合があります。その場合は、より多くのRAM(またはより優れたOS)を備えたマシンが必要です。

于 2012-11-16T15:10:28.097 に答える
1

読み込みには拡張vtd-xmlを使用する必要があります...標準のvtd-xmlは最大2GBのドキュメントの読み込みのみをサポートします...拡張vtd-xmlは最大256GBのサイズのドキュメントをサポートします。また、遅延読み込み(つまり、メモリマッピング)も可能になります。XPathの快適さと効率をまったく失うことはありません。

于 2016-05-02T02:04:40.777 に答える