1s?創(chuàng)建?100G?文件,最快的方法是?
時(shí)間:2021-10-22 15:11:56
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]在我們?nèi)粘9ぷ髦?,為了?yàn)證開(kāi)發(fā)的功能,比如:文件上傳功能或者算法的處理效率等,經(jīng)常需要一些大文件進(jìn)行測(cè)試,有時(shí)在四處找了一頓之后,發(fā)現(xiàn)竟然沒(méi)有一個(gè)合適的,雖然Linux中也有一些命令比如:vim、touch等可以創(chuàng)建文件,但是如果需要一個(gè)100G或者1T的大文件,這些命令就顯得力...
在我們?nèi)粘9ぷ髦?,為了?yàn)證開(kāi)發(fā)的功能,比如:文件上傳功能或者算法的處理效率等,經(jīng)常需要一些大文件進(jìn)行測(cè)試,有時(shí)在四處找了一頓之后,發(fā)現(xiàn)竟然沒(méi)有一個(gè)合適的,雖然 Linux 中也有一些命令比如:
- EOF -
vim、touch
等可以創(chuàng)建文件,但是如果需要一個(gè) 100G 或者 1T 的大文件,這些命令就顯得力不從心,此時(shí)就需要能快速創(chuàng)建大文件命令,接下來(lái)將介紹這些命令的常見(jiàn)用法、命令之間的差異、以及使用時(shí)如何選擇dd
dd
命令的語(yǔ)法如下dd?if=[source]?of=[destination]?bs=[block-size]?count=[counter]
從 source
讀取并拷貝內(nèi)容到 destination
, source
和 destination
都是文件,前者是讀取的文件,后者是寫(xiě)入的文件bs表示塊的大小,單位是字節(jié),后綴中帶了字母
B的換算單位都是
1000, 比如:
1KB = 1000 Bytes、
1MB = 1000 * 1000 Bytes、
1GB = 1000 * 1000 * 1000 Bytes后綴省略了字母 B
的換算單位是 1024
, 比如:1K = 1024 Bytes
、 1M = 1024 * 1024 Bytes
、1G = 1024 * 1024 * 1024 Bytes
count
表示塊的數(shù)量,表示 dd
命令需要執(zhí)行多少次讀取并寫(xiě)入的操作bs
乘以 count
其實(shí)就表示目標(biāo)文件的大小,也即需要?jiǎng)?chuàng)建的文件的大小,比如:下面的命令可以創(chuàng)建一個(gè) 10G 大小的文件[root@localhost?dd_cmd]#?dd?if=/dev/zero?of=testfile?bs=1G?count=10
記錄了10 0?的讀入
記錄了10 0?的寫(xiě)出
10737418240字節(jié)(11?GB)已復(fù)制,8.61643?秒,1.2?GB/秒
[root@localhost?dd_cmd]#?du?-h?testfile??
10G?????testfile
[root@localhost?dd_cmd]#
上面的命令表示從 /dev/zero
文件每次讀取 1G
大小的數(shù)據(jù)并寫(xiě)入當(dāng)前目錄中的 testfile
文件, bs=1G count=10 表示塊大小是1G
,總共有10個(gè)塊, 所以目標(biāo)文件最終的大小是: 1G * 10 = 10G/dev/zero
是一個(gè)特殊的字符設(shè)備文件,當(dāng)讀取它的時(shí)候,它會(huì)返回空數(shù)據(jù),這里表示從 /dev/zero
讀取空的數(shù)據(jù)寫(xiě)入 testfile
中命令 du -h testfile
的結(jié)果也說(shuō)明了 testfile
大小是 10G
從結(jié)果可以得知,用 dd
命令創(chuàng)建一個(gè) 10G
大小的文件花費(fèi)了約 8.6 秒yes
前面的dd
命令創(chuàng)建的是空字符的文件,如果想文件中包含自定義的字符,可以使用 yes
命令,它的作用是循環(huán)輸出一行指定的字符串,直到進(jìn)程結(jié)束,為了控制文件的大小并打破循環(huán),我們借助 head
命令來(lái)實(shí)現(xiàn),使用 yes
命令創(chuàng)建包含指定內(nèi)容文件的語(yǔ)法如下yes?[string]?|?head?-c?[size?of?file]?>?[name?of?file]
string
是寫(xiě)入文件每一行的字符串head -c [size of file]
是接收指定大小的字符串,單位是字節(jié),后面也可以接 K
、KB
、M
、MB
、G
、GB
等單位下面的實(shí)例是往 yesfile
文件寫(xiě)入,每行的內(nèi)容是: this is a test content
, 一直到文件大小達(dá)到 10G
[root@localhost?dd_cmd]#?time?yes?"this?is?a?test?content"?|?head?-c?10G?>?yesfile
real????0m11.266s
user????0m8.898s
sys?????0m13.217s
[root@localhost?dd_cmd]#?du?-h?yesfile??
10G?????yesfile
從結(jié)果可以看出,yes
命令創(chuàng)建一個(gè) 10G
的文件花費(fèi)了 13.2 秒,比 dd
命令慢fallocate
fallocate
命令使用下面的語(yǔ)法 創(chuàng)建大文件fallocate?-l?[size?of?file]?[name?of?file]
-l
選項(xiàng)表示文件大小,單位是字節(jié),后面可以接 K
、KB
、M
、MB
、G
、GB
等單位下面的命令是創(chuàng)建一個(gè) 10G
大小的文件[root@localhost?dd_cmd]#?time?fallocate?-l?10G?allocatefile
real????0m0.002s
user????0m0.000s
sys?????0m0.003s
[root@localhost?dd_cmd]#?du?-h?allocatefile??
10G?????allocatefile
上述的 time
命令只是為了統(tǒng)計(jì)創(chuàng)建文件的時(shí)間,從結(jié)果可以看出:fallocate
命令創(chuàng)建一個(gè) 10G
大小的文件竟然只花費(fèi)了 0.003 秒命令 du -h allocatefile
是查看創(chuàng)建的文件大小,從結(jié)果可知,allocatefile
文件大小確實(shí)是 10G
truncate
truncate
命令是縮小或者擴(kuò)展文件至指定大小,它的語(yǔ)法如下:truncate?-s?[file-size]?[name?of?the?file]
-s
選項(xiàng)表示文件大小,單位是字節(jié),跟 fallocate
命令一樣,后面可以接 K
、KB
、M
、MB
、G
、GB
等單位下面是使用 truncate
命令創(chuàng)建一個(gè) 10G
的文件的示例[root@localhost?dd_cmd]#?time?truncate?-s?10G?truncatefile
real????0m0.002s
user????0m0.000s
sys?????0m0.002s
[root@localhost?dd_cmd]#?du?-h?truncatefile?
0???????truncatefile
從結(jié)果可以得到,truncate
命令 創(chuàng)建一個(gè) 10G
的文件也只花費(fèi)了 0.002 秒,和 fallocate
差不多但是, du -h truncatefile
命令的結(jié)果表明 truncatefile
大小為 0原因是 truncate 命令 創(chuàng)建的是一個(gè)稀疏文件而不是實(shí)際的文件 ,稀疏文件不會(huì)占用磁盤(pán)空間注意:fallocate
命令只支持 btrfs、ext4、 ocfs2、xfs
這幾種文件系統(tǒng),而 truncate
命令支持所有的現(xiàn)代文件系統(tǒng)創(chuàng)建速度的差異
從上面的幾個(gè)實(shí)例可以看出,同樣是創(chuàng)建一個(gè)10G
的文件, fallocate
和 truncate
命令只需要不到 0.1 秒的時(shí)間,但是 dd
命令需要 8.6 秒的時(shí)間,yes
命令需要 13.2 秒,這中間相差了幾百倍,為什么會(huì)有這么大的差別呢?fallocate
將空間分配給文件,但是不會(huì)往文件中寫(xiě)入任何數(shù)據(jù)truncate
創(chuàng)建的是稀疏文件,和 fallocate
一樣,它也不會(huì)往文件中寫(xiě)入任何數(shù)據(jù)dd
和 yes
都有寫(xiě)文件操作,而這需要大量的 IO 時(shí)間,所以同樣創(chuàng)建 10G
的文件,它們比 fallocate
和 truncate
要慢很多如何選擇
dd
、yes
、fallocate
、truncate
這幾個(gè)命令都可以創(chuàng)建大文件, 在日常的使用中,我們?cè)撊绾芜x擇呢 ?對(duì)速度沒(méi)有很高的要求的情況下,一般首選 dd
,如果希望創(chuàng)建的文件中寫(xiě)入自定義的內(nèi)容的話,使用 yes
如果想快速的創(chuàng)建大文件,比如 1 秒內(nèi)創(chuàng)建一個(gè) 100G 的文件,選擇 fallocate
和 truncate
,如果還需要確保文件是實(shí)際占用磁盤(pán)空間的話,就只剩下 fallocate
可選了大部分情況下,fallocate
都能滿足要求,所以不想仔細(xì)分析的話,使用 fallocate
就行了小結(jié)
本文介紹了Linux下創(chuàng)建大文件的幾種方法,并對(duì)所提供的方法進(jìn)行了比較,最后提供了如何選擇使用哪種方法的一些建議,文中只對(duì)dd
、yes
、fallocate
、truncate
命令做了簡(jiǎn)要的說(shuō)明,更多的介紹請(qǐng)參考 man
文檔- EOF -