大規模なデータ移行プロジェクトの可能なソリューションとして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ヒープスペースエラーが発生します。
- JVM引数:-Xmn100M-Xms500M-Xmx2048M。
- JVM引数:-Xmn100M-Xms500M-Xmx4096M。
そしてMavenで:
- MAVEN_OPTS = -Xmn100M-Xms500M-Xmx2048Mを設定します
- 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)
どんな助けでもいただければ幸いです。