我需要創建一個充滿任何東西的巨大文件。我做這種方式,但它需要很長時間:創建大文件的最快方法?
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
什麼是這樣做的最佳方式
我需要創建一個充滿任何東西的巨大文件。我做這種方式,但它需要很長時間:創建大文件的最快方法?
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
什麼是這樣做的最佳方式
在* 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。
我相信這會在支持它的文件系統上創建一個稀疏文件......這取決於他是否想要一個稀疏文件或一個真實文件 – Earlz
@Earlz以及我可以在編輯時使用/ dev/random,因此它在全部 – texasbruce
如果全部爲零,那麼你也應該不能在dd中使用'seek'指令。沒有查找它不會稀疏......另外,/ dev/random顯然比/ dev/zero慢得多,原因很明顯 – Earlz
一個純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
什麼是你需要創建一個巨大的文件的原因是什麼?內容是否重要,還是僅僅需要一個充滿亂碼的大文件? (如果它真的是性能敏感的,你可能想用C編寫它並從Ruby鏈接到它)。 – KChaloux
我只需要爲我的測試目的有很多不同大小的大文件。內容完全不重要。 –
我們說話有多大和多快?我正在愚弄一個概念,在大約20秒內獲得了大約1.5個演出。儘管如此,這可能太慢了。 – KChaloux