先日、Rubyで巨大な配列(Array)を扱うことがありました。
気になるのは巨大な配列を宣言したときのメモリ使用量です。試しに、要素数が10,000個の配列を宣言してみると89,712Byte
ほどメモリを使用していることが分かります。
require 'objspace' # memsize_ofで得られる情報は必ずしも正しいものではありません list = (1..10000).to_a puts ObjectSpace.memsize_of(list) # 89712Byte
下のグラフを見て分かるように要素数が増えれば増えるほど、必要なメモリはほぼ線形的に増えていきます。
要素数が一億(100,000,000)もある配列であれば1GB近くのメモリが必要になるようです。
require 'objspace' def list_mermory_verificator(elm_size) list = (1..elm_size).to_a puts "Array(size=#{elm_size}): #{ObjectSpace.memsize_of(list)}" end list_mermory_verificator(10000) # 89712Byte list_mermory_verificator(100000) # 1021592Byte list_mermory_verificator(1000000) # 11636312Byte list_mermory_verificator(10000000) # 88363080Byte list_mermory_verificator(100000000) # 1006510416Byte ≒ 0.9373...GB
配列の要素数に上限がない可変長なケースでは、何も考えずに巨大な配列を作ってしまい、メモリを圧迫してしまうことが想像できます。では、どうすれば巨大な配列をメモリの使用量を抑えたまま、扱うことができるでしょうか。
続きを読む