NTFSに負荷をかけてみるテスト

大量のファイルが入っているディレクトリから、「特定の年月のファイルだけ別ディレクトリに移動するRubyスクリプト」を書いた。負荷テストをしたところ、大変遅い。

ディレクトリのファイルの数を見ていたのですが、3万ファイルくらいまでは高速に動いているようなのですが、急にがくっと遅くなっているようで、結局結果は下記のとおり。

  1. Rubyでコピー : 2時間16分
  2. Rubyで移動 : 1時間55分
  3. DOSコマンドでコピー : 1時間50分
  • ここから推察されるのは、
    • Rubyのオーバーヘッドはそこそこあるが、極端にはない。
    • Windowsのコマンドで実施しても遅いので、大量のファイルを1ディレクトリに置くのはよろしくない?

遅くなる原因はなんなんだろう。
NTFSのせい?ディスクのせい?ライトキャッシュのせい?
これが普通なのか?

Rubyスクリプト(ベタ書きスクリプト

#第一引数 コピー元ディレクトリ
#第二引数 コピー先ディレクトリ
#第三引数 日付(yyyymm)

require 'date'
require 'fileutils'
require 'find'

p "start : " + Time.now.strftime("%Y%m%d%H%M%S")

day = Time.now
logprefix=day.strftime("%Y%m%d%H%M%S")

copyfrom=ARGV[0]
prefixdate=ARGV[2]
copyto=ARGV[1] + "\\" + prefixdate +"-"+ logprefix

d = Date.new(prefixdate[0..3].to_i,(prefixdate[4..5].to_i + 1) ,1)
d = d - 1
1.upto(d.strftime("%d").to_i){|num|
    FileUtils.makedirs(copyto + "\\"+ num.to_s.rjust(2,"0"))
} 

#ディレクトリのファイル一覧を取得
#ファイルの年月が一致していれば移動
Find.find(copyfrom) {|f|
  if File.file?(f)
    if prefixdate == File::stat(f).mtime.strftime("%Y%m")
#      FileUtils.copy_file f , copyto + "\\" + File::stat(f).mtime.strftime("%d") + "\\"+File.basename(f) , true
      FileUtils.move f , copyto + "\\" + File::stat(f).mtime.strftime("%d") + "\\"+File.basename(f)
    end
  end
}

p "end   : " + Time.now.strftime("%Y%m%d%H%M%S")

exit