コーヒーおかわり

データサイエンティストを目指す大学院生の日記。

メモリが足りない場合に考えるべきこと

まえがき

私は研究で大きなデータセットを用いてプログラミングすることがよくある。
データのサイズが大きいとRAMの容量が32GBのサーバだとメモリが足りなくなる。そんな時に考えるべきことをまとめておく。

メモリが足りない場合の対処手順

  1. メモリを買う。スケールアウトできるように最初からプログラムを作成しているなら、マシンを買い足す。
  2. 予算などの都合で1が実行できない場合、プログラムを見直す。

1についてだが、最も簡単で小さいリスクでメモリ不足を解決できる。しかも早い。2についてだが、すでに動いているプログラムをいじるため、リスクがある。しかし、場合によっては少ないコストでメモリの削減が実現できるから、これも考えるべきである。

プログラムの見直し

精度の変更

精度を変更する。具体的には64bitの表現を32bit表現に変更する。Pythonのnumpyであれば、

import numpy as np

array = np.arrray([1, 2, 3])
array32 = array.astype(np.float32)

のように変更できる。 これができるのは機械学習のように数値の厳密な精度を要求されない場合だ。しかも、これはリスクが小さく実現でき,かつ効果的だ。具体的には64bitから32bitに変更した場合は、単純に計算して消費するメモリが半分で済む。

メモリを無駄に確保していないか

例えば巨大な2次元配列を行ごとに処理する必要があるとする。このとき2次元配列を全てメモリに格納する必要はない。一行ずつ処理すればメモリ消費量は小さくすることができる。この方法はメモリ消費量を抑えることができるが、配列すべてをメモリに入れる場合より処理時間が増える場合があるため、よく考えてからプログラムを変更するべきである。

あとがき

メモリが足りないなら、メモリを増設するべきだ。
メモリが足りなくてもハードウェアでなんとかできるように最初からスケーラブルなフレームワーク(Spark)などを使ってプログラムを組むべきだ。プログラムの変更は時間を消費するし、プログラムが動かなくなるリスクもある。研究をしていてそう感じた。