ファイルの読み込みをするときに一気に読み込むのではなく1行ずつ読み込んだ方がメモリ的にいいとのこと
それが本当がどうかの実験をしてみようかと思います。
読み込み対象となるテキストは以下のものです。
test.txt
john m 19
micheal m 28
abbie f 31
dabid m 17
claire f 26
#まず、一気に読み込んでみる
以下のコードでやってみる
require 'objspace'
start_time = Time.new
puts File.read("test.txt")
end_time = Time.new
puts end_time - start_time
puts "#{ObjectSpace.memsize_of_all * 0.001 * 0.001} MB"
読み込む部分をとても短く書きました。
そして、結果は
$ ruby all_read.rb
john m 19
micheal m 28
abbie f 31
dabid m 17
claire f 26
4.9e-05
2.951902 MB
#次に1行ずつ読んでみる
以下のコードでやってみる
require 'objspace'
start_time = Time.new
File.open("test.txt") do |text|
text.each_line do |line|
puts line
end
end
end_time = Time.new
puts end_time - start_time
puts "#{ObjectSpace.memsize_of_all * 0.001 * 0.001} MB"
一気に読み込むのと対照的に少し行数が増えました。
そして、結果は
$ ruby each_read.rb
john m 19
micheal m 28
abbie f 31
dabid m 17
claire f 26
0.000112
2.9598400000000002 MB
数回同じ操作をしたのですが、
行数が少ないと一気に読み込んだほうがメモリの使用量が少ないのかな?と思います。
では、もっと長いテキストでやってみたらどうなるかを考えます。
#もっと長いテキストで考えてみる
test.txt
john m 19
micheal m 28
abbie f 31
dabid m 17
claire f 26
(中略)
john m 19
micheal m 28
abbie f 31
dabid m 17
claire f 26
と、とりあえず同じ行を増やしただけなのですが、
1000行,5000行,10000行で考えてみたいとおもます。
#1000行のテキストの読み込み
それぞれ5回測ってみました。
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
一気に読み込む | 2.965176 MB | 2.963405 MB | 2.965656 MB | 2.965656 MB | 2.965656 MB |
一行ずつ読む | 3.002243 MB | 3.000736 MB | 2.999688 MB | 2.999808 MB | 3.002083 MB |
#5000行のテキストの読み込み |
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
一気に読み込む | 3.010936 MB | 3.011384 MB | 3.009285 MB | 3.008709 MB | 3.008349 MB |
一行ずつ読む | 2.542326 MB | 2.542286 MB | 2.542246 MB | 2.542286 MB | 2.54435 MB |
#10000行のテキストの読み込み
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
一気に読み込む | 3.065925 MB | 3.065341 MB | 3.065173 MB | 3.068216 MB | 3.067936 MB |
一行ずつ読む | 2.403886 MB | 2.404046 MB | 2.404534 MB | 2.404366 MB | 2.403886 MB |
#結論
明らかになりました。
行が増えるにつれて、
「一気に読み込む」が増えるのに対して、逆に「1行ずつ読み込む」が減っている。
多く読み込むのであれば「1行ずつ読み込む」方が良い。
けど、処理の時間的に「一気に読み込む」方が短かったです。それはそうか。
#参考文献
http://simplesandsamples.com/readlines.rb.html
https://techacademy.jp/magazine/7797
https://blog.freedom-man.com/measure-ruby-memory-usage