例えば以下の様な感じで怒られる。
$ xz -9e /tmp/hoge xz: /tmp/hoge: Cannot allocate memory
メモリの状態を表示するには--info-memoryオプションを使う。これでxzが認識している物理メモリサイズと使用メモリ上限値を表示できる。以下のシステムでは物理メモリが249MiBであることがわかる。-9eで必要な圧縮メモリサイズは674MiBなので不足していることがわかる。
$ xz -vv --info-memory Total amount of physical memory (RAM): 249 MiB (260,526,080 B) Memory usage limit for compression: Disabled Memory usage limit for decompression: Disabled
例えば-8eにする例。圧縮できるようになり、この時のfilter chainは以下の様な感じ。
$ xz -vv -8e /tmp/hoge xz: Filter chain: --lzma2=dict=32MiB,lc=3,lp=0,pb=2,mode=normal,nice=273,mf=bt4,depth=512 xz: 370 MiB of memory is required. The limiter is disabled. xz: Decompression will need 33 MiB of memory. /tmp/hoge (1/1) 100 % 712 B / 1,291 B = 0.552
同様に-9eの場合の失敗例のfilter chainを表示。
$ xz -vv -9e /tmp/hoge xz: Filter chain: --lzma2=dict=64MiB,lc=3,lp=0,pb=2,mode=normal,nice=273,mf=bt4,depth=512 xz: 674 MiB of memory is required. The limiter is disabled. xz: Decompression will need 65 MiB of memory. /tmp/hoge (1/1) xz: /tmp/hoge: Cannot allocate memory
基本-9eで使用メモリを制限する例。--memlimitオプションは50%や10MiBなどの単位の値をとれる。また、環境変数XZ_DEFAULTSでxzが実行される時に自動的に考慮されるデフォルトオプションを指定することもできる。
$ xz -vv --memlimit=50% -9e /tmp/hoge xz: Filter chain: --lzma2=dict=64MiB,lc=3,lp=0,pb=2,mode=normal,nice=273,mf=bt4,depth=512 xz: 674 MiB of memory is required. The limit is 125 MiB. xz: Decompression will need 65 MiB of memory. xz: Adjusted LZMA2 dictionary size from 64 MiB to 9 MiB to not exceed the memory usage limit of 125 MiB /tmp/hoge (1/1) 100 % 712 B / 1,291 B = 0.552