关于大量文件的copy,delete操作方式效率初探

拷贝大量文件时,用cp有诸多不便(例如命令意外中断后,无法续传;如果强行覆盖的话,又会浪费时间;不覆盖的话,倒是可以通过echo "n"|cp -r /source /destination来完成,但是经过我的实验,在大量文件下,传递n给cp的覆盖提示也会时间延迟,所以对于已经存在的文件同样存在时间上的浪费)

rsync 拥有很多特性,可以避免上面提到cp的种种不便,但是考虑到操作大量文件,就不得不考虑效率

下面是对大量文件的拷贝、删除操作,基于cp、rm -rf、rsync三种方式的效率对比

实验过程拷贝47G的数据(大小基本分散在25M以下文件数量11041个)

一、拷贝

1、通过cp方式

time cp -rp -v /app/glusterfs/NetworkDisk /home/

real    16m29.876s
    user    0m0.889s
    sys     1m59.575s

2、rsync方式

time rsync -av /app/glusterfs/NetworkDisk /home/

real    16m34.557s
    user    8m53.267s
    sys     4m56.069s

二、删除

1、通过rm -rf

time rm -rf /home/NetworkDisk

real    0m3.341s
    user    0m0.002s
    sys     0m3.297s

2、通过rsync --delete

rsync -a --delete /empty /home/NetworkDisk

real    0m1.709s
    user    0m0.014s
    sys     0m1.573s

通过以上对比:

貌似在复制速度上,两者不相上下

而在删除操作上,我们看到rsync --delete 比rm -rf快了约2s。

为了得出更可信的结果,我又做了针对10W小文件的操作对比,如下

首先生成10W小文件

for i in {1..100000};do dd if=/dev/zero of=/app/test/$i bs=100k;done

一、拷贝

1、time cp -rp -v /app/test /home/

real    6m21.137s
    user    0m1.848s
    sys     0m34.099s

2、rsync -av /app/test /home/、

real    3m56.437s
    user    1m53.502s
    sys     1m21.125s

二、删除

1、rm -rf /app/test

real    0m4.527s
    user    0m0.143s
    sys     0m4.339s

2、rsync -a --delete /empty /app/test

real    0m0.122s
    user    0m0.000s
    sys     0m0.009s

通过以上对10W小文件的操作,可以得出结论,对于大量文件的拷贝、删除操作,rsync相比较cp和rm还是有很大优势的

最后附上一篇相关文章

http://www.linuxeden.com/html/news/20130613/140243.html

关于大量文件的copy,delete操作方式效率初探

时间: 2024-08-20 03:14:46

关于大量文件的copy,delete操作方式效率初探的相关文章

VS生成后事件对文件的copy以及更换扩展名

在VC++2012的项目里,属性内有生成事件. 可以用后期生成事件命令行做一些生成之后的事情,比如对编译出的.dll,.lib,.pdb等文件进行copy或者更改扩展名. 我用到的就是将和项目同名的.dll和.pdb更改扩展名后复制到另一个文件夹. 命令为: copy "$(TargetDir)$(ProjectName).*" "$(SolutionDir)\otherDir\$(ProjectName).*.bytes" 假如我的项目名字叫testDemo.那么

C# 文件搬运(从一个文件夹Copy至另一个文件夹)

时常我们会遇到文件的复制.上传等问题.特别是自动化生产方面,需要对机台抛出的档案进行搬运.收集,然后对资料里的数据等进行分析,等等. Winform下,列举集中较常见的档案的搬运. 1 private void MoveFile() 2 { 3 string Frompath = @"D:\Test\OutPut"; 4 string directoryPath = @"D:\report"; 5 try 6 { 7 string[] picList = Direc

C#实现文件Move操作和文件的Copy操作

文件移动(Move)操作和文件的复制(Copy)是C#程式开发经常遇到的方法,根据传入的源文件地址和目标文件地址参数,实现对文件的操作.实现代码如下: Move操作代码: public static void MoveFolder(string sourcePath, string destPath) { if (Directory.Exists(sourcePath)) { if (!Directory.Exists(destPath)) { //目标目录不存在则创建 try { Direct

文件Copy和文件夹Copy

using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //源目录 string sourceDirectory = @"E:\\Program"; //目标目录 string destDirectory

csproj文件中copy指令的使用方式

实际开发中有很多项目需要引用第三方的dll或者资源文件,且文件比较多,在运行时这些文件需要被拷贝到BIN目录. 使用VS自带的"复制到输出目录",似然方便,但是比较不零活,经过多次摸索,终于有了一个很好的解决办法. 将csproj中copy指令的用法如下: 1.记事本打开启动项目的 csproj文件,在 的上一行添加内容 2.保存文件,vs里面重新加载. 3.编译,验证文件是否被拷贝. 实际使用截图如下: 原文地址:https://www.cnblogs.com/88223100/p/

应用:文件夹copy器(多进程版)

import multiprocessing import os import time import random def copy_file(queue, file_name,source_folder_name, dest_folder_name): """copy文件到指定的路径""" f_read = open(source_folder_name + "/" + file_name, "rb")

(六)两种方式将一个文件的内容复制到另一个文件(第二种方式效率更高,第一种一个字符一个字符的读写,第二种一个数组一个数组的读写)

一:将一个文件复制给另一个文件,每次读取一个字符import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; public class CopyFile { /** * 需求:将一个文件复制给另一个文件 * @param args * @throws Exception */ public static void main(String[] args) throws Exce

文件的copy

def mycopy(src_filename, dst_filename): try: fr = open(src_filename, "rb") try: try: fw = open(dst_filename, "wb") try: while True: b = fr.read(4096) if not b: break fw.write(b) finally: fw.close() except OSError: print("打开目标文件失败&

C#对图片文件的压缩、裁剪操作初探

在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意. 于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小.尺寸的目标图片. 进入正题--> 先说图片压缩 第一步:需要读取一个图片文件,读取方法: // <param name="ImageFilePathAndName">图片文件的全路径名称&