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

提交評論