2012-11-08 72 views
1

我需要創建一個充滿任何東西的巨大文件。我做這種方式,但它需要很長時間:創建大文件的最快方法?

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 

什麼是這樣做的最佳方式

+0

什麼是你需要創建一個巨大的文件的原因是什麼?內容是否重要,還是僅僅需要一個充滿亂碼的大文件? (如果它真的是性能敏感的,你可能想用C編寫它並從Ruby鏈接到它)。 – KChaloux

+0

我只需要爲我的測試目的有很多不同大小的大文件。內容完全不重要。 –

+0

我們說話有多大和多快?我正在愚弄一個概念,在大約20秒內獲得了大約1.5個演出。儘管如此,這可能太慢了。 – KChaloux

回答

5

在* 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。

+0

我相信這會在支持它的文件系統上創建一個稀疏文件......這取決於他是否想要一個稀疏文件或一個真實文件 – Earlz

+0

@Earlz以及我可以在編輯時使用/ dev/random,因此它在全部 – texasbruce

+0

如果全部爲零,那麼你也應該不能在dd中使用'seek'指令。沒有查找它不會稀疏......另外,/ dev/random顯然比/ dev/zero慢得多,原因很明顯 – Earlz

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 
相關問題