2017-06-30 6 views
0

現在、大きなXMLファイルを圧縮するためにEXIを評価中です。大とは、20 GB(20)のXMLファイルを意味します。EXIを使用する:大規模なXMLファイル(〜20 GB)を扱うには?

EXI圧縮コーデックとEXI圧縮以外のコーデック(gzip/lzma)はいずれも、Java仮想マシン上で動作するScalaアプリケーションに統合されています。 GZIPとLZMAはcommons-compressによって提供されます。すべてのコーデックは、これらのサードパーティライブラリのJavaで実装されています。 8ギガバイト(JVM 6 GB)64ビットLinuxシステムの

、両方ExificientとOpenExiはエンコードできるが、元のXMLファイルは10GB程度である場合、デコードに失敗します。 1.8-8u40

  • JVMの引数:GZIP/LZMA

  • OracleのJDKと1000000の

  • 問題なし:

    • ExificientはOpenExiは、ArrayIndexOutOfBoundsExceptionがで失敗のOutOfMemory
    • で失敗-Xmx6g -XX:+UseG1GC -XX:+UseStringDeduplication

    • resu 〜70メガバイト

    の大きさを持っているEXI-エンコードされたXMLファイルをlting私の質問:

    • EXIは、XML入力ファイルサイズに沿ってそのメモリ使用量が増加し(原因、それはアルゴリズムの基礎となるだし)を暗示していますか?もしそうなら、必要なメモリを計算する簡単な式がありますか?
    • メモリを増やす場合を除いて、動作させるための方法はありますか?
  • 答えて

    1

    EXI形式では、メモリ使用を制限する「オプション」があります。

    https://www.w3.org/TR/exi/#options

    valueMaxLengthvaluePartitionCapacity長とEXI文字列テーブル内のエントリの数を制限します。

    たとえば、valueMaxLengthを16に設定すると、16より大きい場合は文字列がテーブルに追加されません。文字列テーブルは処理中に大きくなり、最後までメモリに保持する必要があります。

    オプションvaluePartitionCapacityは、テーブル内の文字列の数を制限します(ラウンドロビン方式)。

    EXI圧縮を使用する場合は、blockSizeも減らしてください。このことができます

    希望、

    - ダニエル

    関連する問題