2016-01-21 84 views
2

對於性能測試,我需要製作數千份單個文件。在for循環中,使用bash腳本有沒有比cp更快的方法?我知道存在創建數千個文件(rsync等)的一個副本的工具,但是有沒有一種工具可以利用源文件始終保持相同來加速此過程?快速複製一次文件數千次

+0

查找GNU並行 – 123

+0

並行只不過是一個'for'循環更有效,只是語法上更加簡潔。 – chepner

+2

我希望寫入磁盤是什麼會放慢速度。 –

回答

3

大廈@ chepner的想法...

這需要6.3秒(8在同一時間),使10000份:

parallel -N 8 'cat source.txt | tee copy{1}.txt copy{2}.txt copy{3}.txt copy{4}.txt copy{5}.txt copy{6}.txt copy{7}.txt copy{8}.txt ' ::: {1..10000} 

這需要19秒(一次一個):

for i in {1..10000}; do cp source.txt copy${i}.txt; done 

這需要5秒(10以時間):

time parallel -N 10 'cat source.txt | tee copy{1}.txt copy{2}.txt copy{3}.txt copy{4}.txt copy{5}.txt copy{6}.txt copy{7}.txt copy{8}.txt copy{9}.txt copy{10}.txt' ::: {1..10000} 

請注意,我正在SSD上運行,旋轉磁盤的結果可能會更糟糕。

+0

'parallel'沒有辦法用盡可能多的參數運行命令,而不必硬編碼固定數量的參數嗎? – chepner

+0

@chepner是的,但我正在努力研究如何將它們全部選出來,並用'copy'作爲前綴並用'.txt'後綴。 –

+0

也許@OleTange必須幫助我 - 再次! –

1

你可以試試tee。例如,

cat source.txt | tee copy1.txt copy2.txt copy3.txt > copy4.txt 

它可能不是顯著比運行的cp多個副本快,但稍顯不足進程啓動的開銷。 (這裏,一次運行tee而不是cp 4次。)

+2

我想你可以使用'copy {0001..1000} .txt'或其他來簡化命名。 –

+0

'成千上萬的副本'會長久使用這個。也許'cat source.txt | tee copy {1..1000).txt' – 123

+1

根據每個副本文件名的長度,您可能仍然必須將其分成幾個回合,因爲具有數千個參數的命令行可能會過長(這是實際上「並行」*可以幫助的東西)。 – chepner

0

我認爲所有基於標準coreutils(cp,tee等等)的方法都會有 - 或多或少 - 相同的性能。他們也有幾十個不同的選項,你並不需要它們,每個選項都使用系統資源。

如果您需要的東西真的很快,您可以自己編碼pcopy。這不是很複雜,你可以使用copy.c(由cp和其他std coreutils程序使用)作爲起點。

我會用下面的辦法:

  1. 讀取源文件一次,並保持它在內存中(假設你可以)
  2. 啓動線程的配置數量
  3. 每個線程寫入相同複製源文件到磁盤(或者同步O_DIRECT與對齊塊或異步IO)

我認爲這樣編碼pcopy可以顯着快於std coreutils。

0

將文件複製到一個B1 .. B1000

echo b{1..1000} | xargs -n 1 cp a