2

何かでいっぱいの巨大なファイルを作成する必要があります。私はこのようにやっていますが、時間がかかります:

exit 1 unless ARGV.length > 0
File.open("file-#{ARGV[0]}M.txt", 'w') do |f| 
  (ARGV[0].to_i*1048576).times {f.write(1) }
end

それを行う最善の方法は何ですか(プラットフォームに依存しない方法で?)

4

2 に答える 2

6

*nix では、次を使用しますdd

system("dd if=/dev/zero of=" + f + " bs=1 count=0 seek=" + ARGV[0] + "M");

ファイルに(ゼロの代わりに)コンテンツが必要な場合は、使用します

/dev/random

if代わりに/dev/zero

非スパースファイルが必要な場合は、使用します

bs=#{ARGV[0]}M

そして省略seek


普遍的な方法:

#Create a 1M fill buffer
fills = '1'*1048576
File.open("file-#{ARGV[0]}M.txt", 'w') do |f| 
  (ARGV[0].to_i).times {f.write(fills) }
end

あなたが持っているものと似ていますが、一度に 1M 書き込みます。一度に 1 バイトを書き込むと、ハードディスクの検索と書き込みに多くのオーバーヘッドが生じます。一度に 1M を書き込むと、はるかに高速になります。さらに高速なハード ドライブ (16M/s など) を使用している場合は、1M を 16M に増やしてみてください。

于 2012-11-08T20:31:57.487 に答える
3

純粋な Ruby オプション:

n = ARGV[0] or exit 1
File.open("file-#{n}M.txt", 'w') do |f| 
  contents = "x" * (1024*1024)
  n.to_i.times { f.write(contents) }
end
于 2012-11-08T20:57:22.173 に答える