为什么cp很多小文件非常慢——对cp和rm命令的一些思考
2013-12-18 23:08
302 查看
linux中的文件复制命令——CP
linux中文件剪切的命令——MV
1.问题背景
今天在某个目的动作过程中想把一个文件夹下的文件复制到另外的一个文件夹下
cp -fr ./dir1/ /dir2/
发现终端一直在提示运行中,就是一直在复制,好一会儿都没有停。我要复制的文件都不是很大,全部加起来也就80M的样子,但是有很多零散的小文件,很多。
此时我已经按下enter很久了。。。。但是提示符一直闪啊闪。。。就是不停
2,问题探索
看看究竟发生了什么
cp -vfr ./linux-source-3.8.0/ /wa/
这家伙足足闪了八分钟。。。还好,最后停了。。。
尝试用rm把一个文件夹里面的文件移动到另外的文件夹
可以看到这里只有一个“动作”--->
而用cp命令的时候,每一个文件都有一个--->“动作”
我们可以大胆的推理,这里rm实质上只是交换了指针变量里储存的地址,而cp命令要把所有的文件地址变量都找到,然后读取内容,然后再另外的文件夹地址下开辟一块内存去储存文件内容。这就涉及到寻址。而寻址就是造成这种“出奇的慢”的原因。
3.对于cp和win里的ctrl+c相比很慢的解释----文件系统寻址方式造成的差异
求助了贴吧的“小_埃”,这是他的解释
“零散文件会导致硬盘频繁寻道,去看看硬盘的平均寻道时间参数吧,一次就若干毫秒,这段时间之内所有读写操作全要停下来等”
“另外,不同文件系统对于小文件的处理方式,也会对性能造成巨大的影响。
楼主说Win7比Linux复制同样的文件快,这不是不可能的,而且是很有可能的。
ext4是怎么实现的我不太清楚,我就说FAT32和NTFS两个文件系统的实现吧。
FAT32是不管文件的情况,一律把文件名等信息放在文件分配表里,然后把文件内容放在磁盘后面的扇区中。
而NTFS则会判断文件大小,如果文件足够小,则将文件名、文件内容一起放进MFT里,如果文件大小更大,不适合放进MFT里,则会把文件名等信息放在MFT里,并把文件内容放在磁盘后面的扇区中。
这两种文件系统在处理零散小文件时,性能差距非常巨大,前者需要磁盘频繁寻道,复制每一个小文件需要寻道4次以上,而后者复制若干个零散小文件,只需要寻道几次就够了。7200rpm的硬盘平均寻道时间都在6~9ms左右,因此性能差距立见分晓”
linux中文件剪切的命令——MV
1.问题背景
今天在某个目的动作过程中想把一个文件夹下的文件复制到另外的一个文件夹下
cp -fr ./dir1/ /dir2/
发现终端一直在提示运行中,就是一直在复制,好一会儿都没有停。我要复制的文件都不是很大,全部加起来也就80M的样子,但是有很多零散的小文件,很多。
此时我已经按下enter很久了。。。。但是提示符一直闪啊闪。。。就是不停
2,问题探索
看看究竟发生了什么
cp -vfr ./linux-source-3.8.0/ /wa/
这家伙足足闪了八分钟。。。还好,最后停了。。。
尝试用rm把一个文件夹里面的文件移动到另外的文件夹
可以看到这里只有一个“动作”--->
而用cp命令的时候,每一个文件都有一个--->“动作”
我们可以大胆的推理,这里rm实质上只是交换了指针变量里储存的地址,而cp命令要把所有的文件地址变量都找到,然后读取内容,然后再另外的文件夹地址下开辟一块内存去储存文件内容。这就涉及到寻址。而寻址就是造成这种“出奇的慢”的原因。
3.对于cp和win里的ctrl+c相比很慢的解释----文件系统寻址方式造成的差异
求助了贴吧的“小_埃”,这是他的解释
“零散文件会导致硬盘频繁寻道,去看看硬盘的平均寻道时间参数吧,一次就若干毫秒,这段时间之内所有读写操作全要停下来等”
“另外,不同文件系统对于小文件的处理方式,也会对性能造成巨大的影响。
楼主说Win7比Linux复制同样的文件快,这不是不可能的,而且是很有可能的。
ext4是怎么实现的我不太清楚,我就说FAT32和NTFS两个文件系统的实现吧。
FAT32是不管文件的情况,一律把文件名等信息放在文件分配表里,然后把文件内容放在磁盘后面的扇区中。
而NTFS则会判断文件大小,如果文件足够小,则将文件名、文件内容一起放进MFT里,如果文件大小更大,不适合放进MFT里,则会把文件名等信息放在MFT里,并把文件内容放在磁盘后面的扇区中。
这两种文件系统在处理零散小文件时,性能差距非常巨大,前者需要磁盘频繁寻道,复制每一个小文件需要寻道4次以上,而后者复制若干个零散小文件,只需要寻道几次就够了。7200rpm的硬盘平均寻道时间都在6~9ms左右,因此性能差距立见分晓”
相关文章推荐
- 为什么cp很多小文件非常慢——对cp和rm命令的一些思考
- *Linux常用命令学习1---(安装、文件系统、目录操作命令cd ls mv cp rm mkdir、链接命令ln……)
- Linux基础文件管理命令之rm,mv,cp,touch
- 02.linux的文件系统简介、查看目录ls命令、切换目录cd命令、创建目录mkdir、删除目录rm、移动重命名mv、创建文件touch、拷贝cp
- linux命令,文件与目录(cp,pwd,mkdir,rmdir;ls,cp,rm,mv,basename,dirname;cat,tac,more,less,head,tail,touch,umask,chattr,file,which,locate,find)
- linux下文件的复制、移动与删除命令为:cp,mv,rm
- liunx常用文件、目录处理命令(mkdir,rmdir,pwd,cp,mv,rm)
- Linux中文件路径及cp mv rm等命令的理解
- linux下文件的复制、移动与删除命令为:cp,mv,rm
- 文件的复制,移动和删除命令(cp,mv,rm)
- linux下文件的复制、移动与删除命令为:cp,mv,rm
- linux中的一些基础命令的使用(which,whereis,locate,find,alias,file,ls,cat,echo,tar,bzip2,gzip,history,mv,cp,rm)
- Linux命令学习(一):复制(cp),删除(rm)和移动(mv)文件的命令
- linux下文件的复制、移动与删除命令为:cp,mv,rm
- 20160218自学Linux_根文件目录介绍+目录管理命令学习(mkdir,rmdir,tree,touch,stat,rm,nano,cp,mv,insatll)
- linux 文件管理命令cp, mv, rm
- linux-14基础命令之-复制(cp)移动(mv),删除(rm),拷贝文件(dd)
- Linux命令之目录切换、创建/删除/复制/移动文件 - cd,mkdir,cp,mv,rmdir,rm
- 关于静态方法为什么不能被重写的一点思考以及overload的一些坑。
- (转)每天一个linux命令(8):cp 命令,复制文件和文件夹