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