SFMTの針データベース作成プログラム
SFMTの針データベースを作成するプログラムを公開します.最終的なDBの容量は16GB,作成にかかる時間は30分程度です.
ソースコード
https://github.com/RNGeek/QR-Database においてあります.
簡単な解説
大まかにプログラムの流れを説明します.
32bitの初期seedを総当りする部分
417消費以降の針7つを32bit整数にエンコードします.針を7つに抑えることによって針の表現が32bitで済みます.ここで12個針を取って64bit整数にエンコードしてもいいですが,検索する時の性能に差はないことや,ファイルサイズの大きさから,採用しませんでした.またこの部分はOpenMPを用いて並列化しています.
次にエンコードした32bit整数の100で割った余りを計算し,その値によって決まるファイルに初期seedと合わせた64bit整数を書き込みます.これは1つのファイルに初期seedと針の情報を全て書き込むのではなく,100個のファイルに分割して保存するためです.こうすることで後述のソートを行う時にメモリ上でソートできます.
ソート部分
32GBのデータをソートしようとすると大抵のマシンではメモリが足りないため,外部ソートを行う必要があります.しかし上にも書いたように100個ファイルに分割したことで,ファイル1つは320MB程度の大きさになります.これはメモリに乗る大きさです.ソートには parallel-radix-sort
を使いました.
また,最終的なデータの書き出しは初期seedのみに限ることでトータルのファイルのサイズを半減しています.
検索部分
検索にはソート済みデータに対して高速に検索を行える二分探索を採用しました.針7つでは初期seedを完全には絞り込めないので,実際に針の値を計算して妥当性を判定しています.
必要な開発環境
コンパイルができると確認している環境は,Windowsではmsys2
のみです.Visual Studioでコンパイル可能かは検証していません.
それとソースコードをZIPでダウンロードした場合,SFMT
とparallel-radix-sort
に関するフォルダは空になっているので気をつけてください.