快速生成大量隨機大小的文件

要生成大量隨機大小的文件,最簡單的方法是for循環N次。shell

例如,生成100W個0-16K大小的小文件(嘗試時請改小一點數量,否則時間要好久):操作系統

tmp_dir=/tmp/temp

for i in {1..1000000};do
    dd if=/dev/zero of=$tmp_dir/${i}.log bs=`shuf -n 1 -i 0-16`k count=1 &>/dev/null
done

這裏使用dd命令從/dev/zero中取數據填充小文件,其中tmp_dir變量是存放大量小文件的目錄,文件的隨機大小由shuf命令生成。code

可是這樣會很是的慢,不只佔用大量IO,操做系統還繁忙地open、close文件描述符。這樣的建立方式效率極低。ip

爲了避免頻繁open、close文件描述符,能夠直接將建立的文件放進壓縮包中,好比cpio、tar(但不要加數據壓縮功能,如zip、xz等,由於壓縮會佔用大量cpu進行計算),等給定數量的文件建立完後再解壓這個壓縮包。這種方式在shell中實現起來比較複雜。it

更好的方式是使用split命令,它能夠將文件按給定大小均勻切分紅小文件。這裏可使用/dev/zero做爲數據源。io

由於split只能切分紅等大小的文件,因此大小沒法隨機,只能在必定數量的循環下,屢次切分紅等隨機大小的文件。正以下面的for和shuf。for循環

tmp_dir=/tmp/temp

for i in {1..100};do
    dd bs=10000 count=8192 if=/dev/zero |\
    split -b `shuf -n 1 -i 1-16`k -a 5 -d - "$tmp_dir/$i-"
done

每次循環中,dd每次生成8192*10000=8.2M的數據源,這8.2M的數據供split進行分割,分隔的每一個文件都由shuf肯定,好比某次shuf的值爲5,那麼8.2M的數據所有切分紅5k大小的文件共16000個小文件。這樣的操做循環100次。效率

這樣的方式很是快,可是隻循環了100次,shuf的隨機數分配不夠均勻,因此沒法控制文件的數量,好比上面的命令可能會生成200W個文件,若是運氣差可能生成400W個文件。變量

改爲下面的,循環次數增長一些,每次數據源大小小一點:隨機數

for i in {1..10000};do
    dd bs=100 count=8192 if=/dev/zero |\
    split -b `shuf -n 1 -i 1-16`k -a 3 -d - "$i-"
done

生成100W個文件大概須要5分鐘(普通固態下)。一樣的,文件數量不可控制。

相關文章
相關標籤/搜索