Asakusa Framework Advent Calendar 2016の22日目です。
Javaでは、意外と2GBの壁があります。例えばbyte配列は2GBより多いサイズを扱えません。これは、配列の添え字がintなので、Integer.MAX_VALUEより大きな値を指定できない為です。
普通のJavaアプリケーションならそんな大きなサイズのデータは扱わないかもしれませんが、ビッグデータを扱う分散処理フレームワークでは結構有名な問題のようです。(例えばSparkにそんなIssueがある)
で、Asakusa on M3BPも同様の問題があります。
デフォルトでは、各演算子の出力やファイル出力で1ファイル当たり2GBを超えると、エラーが発生します。
ファイル出力の場合は、Direct I/OのExporterでファイル分割するように指定してあれば、分割された個々のファイルがそれぞれ2GBを超えなければ大丈夫です。(「*」で自動分割する場合は問題なし)
どうしても2GBを超えたい場合は、ASAKUSA_HOME/m3bp/conf/m3bp.propertiesでcom.asakusafw.m3bp.buffer.access(デフォルトはnio)にunsafeを指定すると、2GBを超えるデータを出力できます。
(unsafeというのは、sun.misc.Unsafeを使っている?これだとすると、これはsunパッケージなので非推奨であり、Java9辺りで無くなるという話もある)