2

大量のデータ(14ギガ)をtar / gzする必要のあるJavaプログラムがあり、commons-compressを使用しています。これは毎週繰り返される仕事であり、自動化されています。

このサイズのものを圧縮しようとすると、次のようになります。

java.lang.IllegalArgumentException: 13313903445=143144405525 will not fit in octal number buffer of length 11
    at org.apache.commons.compress.archivers.tar.TarUtils.formatUnsignedOctalString(TarUtils.java:212)
    at org.apache.commons.compress.archivers.tar.TarUtils.formatLongOctalBytes(TarUtils.java:265)
    at org.apache.commons.compress.archivers.tar.TarArchiveEntry.writeEntryHeader(TarArchiveEntry.java:749)
    at org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.putArchiveEntry(TarArchiveOutputStream.java:209)
    at com.broadridge.adc.core.commons.io.ADCFileUtils.addFilesToCompression(ADCFileUtils.java:144)
    at com.broadridge.adc.core.commons.io.ADCFileUtils.addFilesToCompression(ADCFileUtils.java:154)
    at com.broadridge.adc.core.commons.io.ADCFileUtils.compressFiles(ADCFileUtils.java:125)
    at com.broadridge.adc.core.commons.io.ADCFileUtils.compressFile(ADCFileUtils.java:106)

私のコードは、少量の情報(約600メガバイト)で正常に機能します。ソースコードを見てきましたが、なぜエラーが発生しているのかわかりません。

なぜこれが起こっているのか誰かが知っていますか?

4

1 に答える 1

3

12 であるTarConstants.SIZELENで定義された制限を超えています。

Javadoc がこれについて教えてくれること:

ヘッダー バッファーのサイズ フィールドの長さ。末尾のスペースまたは NUL を含みます。

スタックトレースにあるTarArchiveEntry.writeEntryHeader(byte[] outbuf)によって使用されます。スタックの後半で、この制限は 1 減算され、例外メッセージの一部である 11 の制限になります。

呼び出しスタックの後半で、TarUtils.formatUnsignedOctalString(final long value, byte[] buffer, final int offset, final int length)が 11 の制限を超えたところで呼び出されます。

そのため、ヘッダー フィールドの最大サイズを超えているようです。

于 2012-04-13T12:29:12.900 に答える