快速复制一个文件数千次

时间:2016-01-21 15:48:22

标签: bash performance

对于性能测试,我需要制作数千个单个文件的副本。使用bash脚本比cp循环中的for有更快的方法吗?我知道存在用于创建数千个文件(rsync等)的一个副本的工具,但是有没有一个工具可以利用源文件总是相同的事实来加速这个过程?

4 个答案:

答案 0 :(得分:3)

以@Chepner的想法为基础......

这需要6.3秒(每次8个)来制作10,000份副本:

0x1

这需要19秒(一次一个):

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}

这需要5秒钟(每次10个):

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

请注意,我在SSD上运行,旋转磁盘的结果可能会更糟。

答案 1 :(得分:1)

您可以尝试tee。例如,

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

它可能没有比运行cp的多个副本快得多,但是进程启动开销略微减少。 (此处,运行tee一次而不是cp 4次。)

答案 2 :(得分:0)

我认为所有基于标准coreutils(cp,tee等)的方法都会 - 或多或少 - 具有相同的性能。它们还有几十种您真正不需要的选项,每种选项都使用系统资源。

如果您需要非常快的东西,可以自己编写pcopy代码。它不是很复杂,您可以使用copy.c(由cp和其他std coreutils程序使用)作为起点。

我会使用以下方法:

  1. 读取源文件一次并将其保存在内存中(假设可以)
  2. 启动可配置的线程数
  3. 每个线程将源文件的相同副本写入磁盘(同步O_DIRECT与对齐块或Asynch IO)
  4. 我认为以这种方式编码的pcopy可能比std coreutils快得多。

答案 3 :(得分:0)

将文件a复制到b1 .. b1000

wsclient.getClientes().toList();