綾小路龍之介の素人思考

[xz] Cannot allocate memory と言われたら --memlimit で使用メモリを制限

搭載メモリが少ないシステムでxz -9で圧縮すると、Cannot allocate memoryと言われて圧縮できない事がある。これは圧縮したいファイルのサイズには依存しない。-8などに変更するのが妥当だけど、memlimitオプションで圧縮や展開に使われるメモリ量を制限することもできる。この時その他のFilter chainは変わらない。

例えば以下の様な感じで怒られる。

$ 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

リファレンス

  1. Raspberry Pi • View topic - Building AUR packages
  2. man page xz section 1
  3. Cannot allocate memory xz - Google 検索
  4. http://multivac.fatburen.org/localdoc/xz/faq.txt

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-07-25T15:09:10+09:00
  2. Modified: 2010-07-25T15:09:10+09:00
  3. Generated: 2017-05-06T23:09:20+09:00