確かに、apply 群を使って書く方が、簡素で読み易いと思います。また、for 文より速くなる場合があるようで、web上ではしきりにお勧めされていました。(apply の中で for が使用されていましたので、劇的に、ということはないと思いますが)。
念のため、apply や lapply を使用して書き直し。
もともと、dependency を算出する関数が、ベクトルを扱えなかったこと、並列化をもくろんでいたことからfor を使っていました。今回は、関数の引数にリストから値を代入する関数を作り、それを apply や lapply で呼んでみました。
で、計算!
が、ダメ。
夜中に計算をかけて、朝に「終わったかな?」と確認しようとすると、動きが異常に遅い。SSDにスワップファイルを作っているようです。リソースモニターを見ると、物理メモリ24GBを使い切っていました。for や foreachであれば、ループのたびに変数を入れ替えながら計算が進むため、それほど大きなメモリは必要としません。が、apply 群では大きなマトリックスをそのまま保持して計算が進んでいくため、いくつかの計算ステップが進めば簡単にメモリ不足に陥るのでしょう。
計算が進むたびに途中経過をディスクに書き出せばメモリを解放できますが、遅くなります。ま、扱うデータの容量を考えながら、方法を選択しないといけないのでしょうね。ビッグデータを扱う場合のパッケージもあるようですので、必要になった段階で検討してみましょう。
いずれにしても、今回は並列化のほうが速いという結果になりました。
コア数 計算時間 メモリ
for(Single) 11.5h 300MB
foreach(4) 3.7h 1.5GB
foreach(6) 3.8h 1.8GB
apply(Single)6hで中止 20GB以上
これで進めてみましょう。
0 件のコメント:
コメントを投稿