WSL 1で大量のメモリを確保する方法
Twitter で isOdd
関数を switch-case で実装する効率の悪い例がバズっていました。この例では 1 から 10000 まで書いていましたが、僕はこれを INT_MIN から INT_MAX まで case を書けば確かに動作するなと(冗談で)思いました。
そこで、INT_MIN から INT_MAX まで case で分岐する C 言語のプログラムを出力するプログラムを書き実行したところ、108 GB のプログラムファイルを得ました。
ここまでは良かったのですが、この巨大なプログラムを gcc でコンパイルしようとしたところ、以下のように out of memory
エラーが出ました。
$ ls -lah calc.c
-rwxrwxrwx 1 nek nek 108G Jun 28 06:10 calc.c
$ gcc -Wall -Wextra -o calc calc.c
cc1: out of memory allocating 115889378580 bytes after a total of 475136 bytes
free
コマンドで確認してみたところ、なるほど確かにメモリ(とスワップ領域)が足りないようです。115889378580 bytes ≒ 116 GB です。
$ free -h
total used free shared buff/cache available
Mem: 15G 6.8G 8.9G 17M 223M 9.0G
Swap: 48G 100M 47G
エラーメッセージで検索したところ、swapon
で一時的にスワップ領域を増やす方法を見つけました。これを試してみたのですが、いまこれを実行していたのが WSL であり、どうやら WSL では swapon
が実装されていないため、スワップ領域を増やすことができませんでした。
$ swapon tmpswap
swapon: /mnt/c/(中略)/tmpswap: insecure permissions 0777, 0600 suggested.
swapon: /mnt/c/(中略)/tmpswap: insecure file owner 1000, 0 (root) suggested.
swapon: /mnt/c/(中略)/tmpswap: swapon failed: Function not implemented
さて、では WSL 上でこの巨大なプログラムをコンパイルするための領域を確保するにはどうすれば良いでしょうか? swapon
以外に何か方法はありませんでしょうか。
※Windows 上の mingw-w64 を使う方法もありそうですが、ひとまず WSL 上でコンパイルできないか考えています。
環境
- Windows 10 Home, Version 1803, Build 17134.829
- Windows Subsystem for Linux (WSL 1) の Ubuntu 18.04.2
- gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0