對於性能測試,我需要製作數千份單個文件。在for
循環中,使用bash腳本有沒有比cp
更快的方法?我知道存在創建數千個文件(rsync等)的一個副本的工具,但是有沒有一種工具可以利用源文件始終保持相同來加速此過程?快速複製一次文件數千次
回答
大廈@ 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上運行,旋轉磁盤的結果可能會更糟糕。
'parallel'沒有辦法用盡可能多的參數運行命令,而不必硬編碼固定數量的參數嗎? – chepner
@chepner是的,但我正在努力研究如何將它們全部選出來,並用'copy'作爲前綴並用'.txt'後綴。 –
也許@OleTange必須幫助我 - 再次! –
你可以試試tee
。例如,
cat source.txt | tee copy1.txt copy2.txt copy3.txt > copy4.txt
它可能不是顯著比運行的cp
多個副本快,但稍顯不足進程啓動的開銷。 (這裏,一次運行tee
而不是cp
4次。)
我認爲所有基於標準coreutils(cp,tee等等)的方法都會有 - 或多或少 - 相同的性能。他們也有幾十個不同的選項,你並不需要它們,每個選項都使用系統資源。
如果您需要的東西真的很快,您可以自己編碼pcopy
。這不是很複雜,你可以使用copy.c(由cp和其他std coreutils程序使用)作爲起點。
我會用下面的辦法:
- 讀取源文件一次,並保持它在內存中(假設你可以)
- 啓動線程的配置數量
- 每個線程寫入相同複製源文件到磁盤(或者同步O_DIRECT與對齊塊或異步IO)
我認爲這樣編碼pcopy
可以顯着快於std coreutils。
將文件複製到一個B1 .. B1000
echo b{1..1000} | xargs -n 1 cp a
- 1. 一次傳遞後文件複製速度更快
- 2. 一次快速修復很多問題
- 3. 快速複製tmp文件
- 4. 快速複製的文件
- 5. SSH複製1000個文件一次
- 6. 帶進度的快速文件複製
- 7. 德爾福快速文件複製
- 8. 加速調用在畫布中繪製一個像素(數千次)
- 9. UISwitch快速切換多次
- 10. 用一次繪製調用繪製數千個基元
- 11. 生成一次隨機數,但生成數千次
- 12. 一次執行數千個SQLServer查詢
- 13. SQL:複製一行多次,每次
- 14. 在數千個文件中迭代速度更快
- 15. 如何快速重命名Powershell中的數千個文件?
- 16. 在iCalendar中快速替代重複次數
- 17. 如何加速一次又一次重複插入事務
- 18. 第一次從臨時文件夾中複製文件的Gradle複製任務
- 19. 在每次重複時加快動畫重複速度?
- 20. SQL 2005 - 快速複製數據庫+數據的快速方法
- 21. 使用批處理腳本每10秒複製一次文件 - 只有一次
- 22. make install嘗試複製文件兩次
- 23. 多次複製一行
- 24. 第一次追加複製
- 25. 複製層次
- 26. n次複製一個數據幀
- 27. 複製列表N次數
- 28. 如何繪製大時間序列(數千次用藥次數/劑量)?
- 29. C#將數千行從文本文件快速添加到數據庫
- 30. 如何在bat-file複製文件從一個來源複製到唯一的文件夾,每次我複製?
查找GNU並行 – 123
並行只不過是一個'for'循環更有效,只是語法上更加簡潔。 – chepner
我希望寫入磁盤是什麼會放慢速度。 –