Linux平台大文件生成和处理方法_第1页
Linux平台大文件生成和处理方法_第2页
Linux平台大文件生成和处理方法_第3页
Linux平台大文件生成和处理方法_第4页
Linux平台大文件生成和处理方法_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页Linux平台大文件生成和处理方法

在日常工作中,为了验证某些场景下的功能,经常需要人为构造一些大文件进行测试,有时需要用大文件来测试(下载)速度,有时需要用大文件来覆盖磁盘空间;偶尔会看到一些(网络)博文会教大家如何构造大文件;但是当需要用到的时候却发现找不到文章了,因此决定总结一下(Linux)下生成以及处理大文件的方法。

虽然Linux中有一些命令如vi、touch等可以创建文件,但是如果需要一个10G或者100G的大文件,这些命令就完全用不上了。这时就需要能快速生成大文件的命令,下面将介绍几个命令,以及他们的用法、差异。

一、生成大文件命令

1、dd

dd(devicedriver)命令表示用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

语法如下:

ddif=[source]of=[des(ti)nation]bs=[block-size]count=[coun(te)r]从source读取并拷贝内容到destination,source和destination都是文件,前者是读取的文件,后者是写入的文件。

bs:表示块的大小,单位是字节,后缀中带了字母B的换算单位都是1000,比如:1KB=1000Bytes、1MB=1000*1000Bytes、1GB=1000*1000*1000Bytes,后缀省略了字母B的换算单位是1024,比如:1K=1024Bytes、1M=1024*1024Bytes、1G=1024*1024*1024Bytescount:表示块的数量,表示dd命令需要执行多少次读取及写入的操作bs乘以count就表示目标文件的大小,也即需要创建的文件的大小比如:下面的命令可以创建一个10G大小的文件

[root@localhosttmp]#ddif=/dev/zeroof=testfilebs=1Gcount=1010+0recordsin10+0recordsout10737418240bytes(11GB,10GiB)co(pi)ed,5.11256s,2.1GB/s[root@localhosttmp]#du-htestfile10Gtestfile上面的命令表示从/dev/zero文件每次读取1G大小的数据并写入当前目录中的testfile文件,bs=1G表示块大小是1G,count=10表示共有10个块,所以目标文件最终的大小是:1G*10=10G。

/dev/zero是一个特殊的字符设备文件,当读取它的时候,它会返回空数据,俗称为0源,所以这里if=/dev/zero表示从/dev/zero读取空的数据写入testfile中。

使用命令du-htestfile可以看出testfile大小是的确是10G。

从上述结果可以得知,用dd命令创建一个10G大小的文件仅仅花费了约5.1秒,速度是比较快的。

扩展:/dev/urandom、/dev/random、/dev/zero、/dev/null解析:

/dev/urandom和/dev/random都可以产生随机的ASCII码字符流,其中/dev/random依赖系统中断,当系统中断不足时,/dev/random设备会“挂起”。/dev/urandom不依赖系统中断,所以在生成特定大小文件时一般使用/dev/urandom,不使用/dev/urandom。/dev/zero“零”设备可以无限的提供空字符,产生二进制的零流/dev/null“空”设备,像”黑洞“一样,所有写入它的内容都会永远丢失,也不会读取到任何内容。常用于禁止标准输出和标准错误的输出,比如抓包命令:tcpdump-ieth1-w/tmp/packet.pcap>/dev/null">yes[string]|head-c[sizeoffile]>[nameoffile]string是写入文件每一行的字符串head-c[sizeoffile]是接收指定大小的字符串,单位是字节,后面也可以接K、KB、M、MB、G、GB等单位如下示例是向文件yesfile写入,每行的内容是:Thisismytestfile,一直到文件大小达到10G。

[root@localhost73]#yes"Thisismytestfile"|head-c10G

>yesfile[root@localhost73]#du-hyesfile10Gyesfile[root@localhost73]#timeyes"Thisismytestfile"|head-c10G

>yesfilereal0m6.635suser0m0.882ssys0m9.645s为了查看使用yes创建大文件的速度,我们这里通过time命令量测yes指令执行时所需消耗的时间及系统资源,从结果可以看出,yes命令创建一个10G的文件花费了9.6秒,比dd命令慢一些。

3、fallocate

fallocate命令表示为文件预先分配或取消分配空间。

语法如下:

fallocate-l[sizeoffile][nameoffile]-l选项表示文件大小,单位是字节,后面可以接K、KB、M、MB、G、GB等单位如下示例是使用fallocate命令是创建一个10G大小的文件

[root@localhost73]#timefallocate-l10Gfalfilereal0m0.027suser0m0.000ssys0m0.001s[root@localhost73]#du-hfalfile10Gfalfile这里通过time命令量测fallocate指令执行时所需消耗的时间及系统资源,从结果可以看出:fallocate命令创建一个10G大小的文件竟然只花费了0.001秒,速度可谓是极快的。

4、truncate

truncate命令表示将文件的大小缩小或扩展到指定的大小。

语法如下:

truncate-s[file-size][nameofthefile]-s选项表示文件大小,单位是字节,跟fallocate命令一样,后面可以接K、KB、M、MB、G、GB等单位如下示例为使用truncate命令创建一个10G大小的文件。

[root@localhost73]#timetruncate-s10Gtrunfilereal0m0.025suser0m0.000ssys0m0.001s#查看文件实际占用磁盘空间大小[root@localhost73]#du-htrunfile0trunfile#查看文件显示大小(逻辑大小)[root@localhost73]#ll-htrunfile-rw-r--r--1rootroot10GJul304:41trunfile这里通过time命令量测fallocate指令执行时所需消耗的时间及系统资源,从结果可以看出,truncate命令创建一个10G的文件也只花费了0.001秒,和fallocate基本一样。但是,du-htrunfile命令的结果显示trunfile大小为0。

原因是truncate命令创建的是一个稀疏文件(空洞文件)而不是实际的文件,稀疏文件不会占用实际的磁盘空间,文件只是看上去逻辑大小比较大,但实际占用空间却是0。

提示:

ls显示文件的“逻辑上”的size,这不是文件真正占用磁盘空间大小,这部分空间也会被其他进程使用du显示文件“物理上”的size,即du显示的size是文件在硬盘上占据了多少个block计算出来的注意:fallocate命令只支持btrfs、ext4、ocfs2、xfs这几种文件系统,而truncate命令支持所有的现代文件系统。

二、优劣分析

对比上述不同命令创建10G的文件的差异,尤其是生成速度方面,比较如下:

dd5.1秒yes9.6秒fallocate0.001秒truncate0.001秒根据上述结果可知,不同命令创建文件的速度方面相差了几千倍,为什么会有如此大的差距呢?我想可能在于以下区别:

dd需要进行写文件操作,进行大量的IOyes需要进行写文件操作,进行大量的IOfallocate将空间分配给文件,但不会写入任何数据到文件中truncate创建的是稀疏文件,不会写入任何数据到文件中dd和yes都有写文件操作,而这需要大量的IO时间,所以同样创建10G的文件,它们比fallocate和truncate要慢很多。如果对生成文件的速度没有很高的要求且对内容无要求的情况下首选dd,如果希望自定义文件内容的话,则使用yes。如果想快速地生成超大文件,比如1秒内创建一个100G的文件,选择fallocate和truncate,如果还需要确保文件是实际占用磁盘空间的话,则只能选择fallocate。

大部分情况下,fallocate都能满足要求,因此,Linux中生成大文件时,建议使用fallocate命令。

三、大文件处理

在Linux下vim、cat打开超大文件,受到内存(硬件)原因,往往会遇到打不开或者内存使用过高导致卡机问题。针对Linux大文件处理一般通过Linux提供的命令split切割成小文件再进行处理。

1、文件分割

针对大文件处理,Linux系统提供了split工具将大文件切分为多个小文件,以方便通过vi,cat等命令进一步处理。既然要生成多个小文件,必然要指定切分文件的单位,支持按行切分以及按文件大小切分,另外还需解决小文件命名的问题。例如,文件名前缀、后缀。如果未明确指定前缀,则默认的前缀为”x”。

语法如下:

split[选项]...[待分割的文件[小文件的前缀]]选项含义如下:

-a:指定输出文件名的后缀长度(默认为2个:aa,ab...)-b:指定每一输出文件的大小,单位为byte-C:每一输出文档中,单行的最大byte数-d:使用数字作为后缀-l:行数分割模式(指定每多少行切成一个小文件;默认行数是1000行)示例如下:

#行切割文件且使用数字后缀[root@localhosttest]#split-l50000000-d-a3yesfileyesfile_[root@localhosttest]#ls-ltotal20971536-rw-r--r--1rootroot10737418240Jun3009:28yesfile-rw-r--r--1rootroot1050000000Jun3009:39yesfile_000-rw-r--r--1rootroot1050000000Jun3009:39yesfile_001-rw-r--r--1rootroot1050000000Jun3009:39yesfile_002-rw-r--r--1rootroot1050000000Jun3009:39yesfile_003-rw-r--r--1rootroot1050000000Jun3009:39yesfile_004-rw-r--r--1rootroot1050000000Jun3009:39yesfile_005-rw-r--r--1rootroot1050000000Jun3009:39yesfile_006-rw-r--r--1rootroot1050000000Jun3009:39yesfile_007-rw-r--r--1rootroot1050000000Jun3009:39yesfile_008-rw-r--r--1rootroot1050000000Jun3009:39yesfile_009-rw-r--r--1rootroot237418240Jun3009:39yesfile_010[root@localhosttest]#[root@localhosttest]#du-hyesfile_0001002Myesfile_000[root@localhosttest]#t(ai)l-5yesfile_000thisismytestfilethisismytestfilethisismytestfilethisismytestfilethisismytestfile#按字节大小分割[root@localhosttest]#split-d-b1Gyesfileyes_[root@localhosttest]#lsyes_00yes_01yes_02yes_03yes_04yes_05yes_06yes_07yes_08yes_09yesfile[root@localhosttest]#du-hyes_001.0Gyes_00#指定输出文件后缀长度[root@localhosttest]#split-d-b1Gyesfile-a3yes_[root@localhosttest]#lsyes_000yes_001yes_002yes_003yes_004yes_005yes_006yes_007yes_008yes_009yesfile2、文件合并

在Linux系统下使用cat命令进行多个小文件的合并也很方便。cat命令用于连接文件并打印到标准输出设备上。

语法如下:

cat[-AbeEnstTuv][--help][--version]fileName参数说明:

-n或--number:由1开始对所有输出的行数编号。-b或--number-nonblank:和-n相似,只不过对于空白行不编号。-s或--squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。-v或--show-nonprinting:使用^和M-符号,除了LFD和TAB之外。-E或--show-ends:在每行结束处显示$。-T或--show-tabs:将TAB字符显示为^I。-A,--show-all:等价于-vET。-e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论