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 回答