快速生成大量随机大小的文件

要生成大量随机大小的文件,最简单的方法是for循环N次。

例如,生成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命令生成。

但是这样会非常的慢,不仅占用大量IO,操作系统还繁忙地open、close文件描述符。这样的创建方式效率极低。

为了不频繁open、close文件描述符,可以直接将创建的文件放进压缩包中,比如cpio、tar(但不要加数据压缩功能,如zip、xz等,因为压缩会占用大量cpu进行计算),等给定数量的文件创建完后再解压这个压缩包。这种方式在shell中实现起来比较复杂。

更好的方式是使用split命令,它可以将文件按给定大小均匀切分成小文件。这里可以使用/dev/zero作为数据源。

因为split只能切分成等大小的文件,所以大小无法随机,只能在一定数量的循环下,多次切分成等随机大小的文件。正如下面的for和shuf。

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分钟(普通固态下)。同样的,文件数量不可控制。

原文地址:https://www.cnblogs.com/f-ck-need-u/p/10504962.html

时间: 2024-08-30 15:08:57

快速生成大量随机大小的文件的相关文章

(I/O流)在100ms内桌面上生成一个200M大小的文件

最终速度取决于硬盘的读写速度 1 package com.laurdawn; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 8 public class test { 9 10 public static void main(String[] args) { 11 // TODO Auto-g

Windows平台快速的创建一个指定大小的文件

有时,我们需要快速创建一个指定大小的文件,做系统测试使用,我们指定在Linux平台中可以使用如下命令: 创建一个100M的空文件 dd if=/dev/zero of=hello.txt bs=100M count=1 在windows平台同样可以使用下列命令快速创建一个指定大小的文件: fsutil file createnew <filename> <length> C:\>fsutil file createnew用法 : fsutil file createnew &

Java、Linux、Win 快速生成指定大小的空文件

Linux dd 命令: dd if=/dev/zero of=<fileName> bs=<一次复制的大小> count=<复制的次数> 生成 50 MB 的空文件: dd if=/dev/zero of=50M-1.txt bs=1M count=50 Windows fsutil 命令: fsutil file createnew <fileName> <文件大小单位字节> 生成 10MB 的空文件: fsutil file createn

linux 快速生成大文件

快速生成大文件 命令一: truncate -s 10G test4 命令二: dd if=/home/sina.html of=/home/mms0.txt bs=1024 count=1 if的参数是输入文件是新浪的主页, of的参数是要生成的文件, bs的参数是每次读入的block大小,这里就设为要生成的文件大小, count的参数是读取的block个数,这里就设为1. 原文地址:https://www.cnblogs.com/tomtellyou/p/12257554.html

快速生成plist文件

在一个项目中,我们会经常用到许多plist文件,但是你怎么快速生成plist 文件吗?我给你提供一个方法. NSArray *title = [[NSArray alloc]initWithObjects:@"限免",@"降价",@"免费",@"专题",@"热榜", nil]; NSArray *iconName= [[NSArray alloc] initWithObjects:@"tabbar

linux快速生成大文件方法

dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero中读取,/dev/zero为0源) 但是这样为实际写入硬盘,文件产生速度取决于硬盘读写速度,如果欲产生超大文件,速度很慢 在某种场景下,我们只想让文件系统认为存在一个超大文件在此,但是并不实际写入硬盘. 则可以dd if=/dev/zero of=test bs=1M count=0 seek=10

Linux技巧——用dd生成指定大小的文件

我们在测试或调试的时候,有时候会需要生成某个size的文件,比如在测试存储系统时,需要将磁盘剩余空间减少5G,最简单的办法就是拷贝一个5G的文件过来,但是从哪儿去弄这样大小的文件呢,或许你想到随便找一个文件,不停的拷贝,最后合并,这也不失为一种办法,但是有了dd,你会更容易且更灵活的实现 我们来case by case的介绍dd的用法.先看第一个 生成一个大小为5G的文件,内容不做要求 命令如下 $ dd if=/dev/zero of=tmp.5G bs=1G count=5 解释一下这里用到

SQLServer如何快速生成100万条不重复的随机8位数字

最近在论坛看到有人问,如何快速生成100万不重复的8位编号,对于这个问题,有几点是需要注意的: 1.    如何生成8位随机数,生成的数越随机,重复的可能性当然越小 2.    控制不重复 3.    考虑性能 针对这个问题,我写了如下的示例来解决,希望能为有这类需求的人提供指导 */ USE tempdb GO --创建测试表 CREATE TABLE tb(id char(8)) --创建用于自动过滤重复值的唯一索引 CREATE UNIQUE INDEX IX_tb ON tb(id) W

linux使用dd命令快速生成大文件

dd命令可以轻易实现创建指定大小的文件,如 dd if=/dev/zero of=test bs=1M count=1000 会生成一个1000M的test文件,文件内容为全0(因从/dev/zero中读取,/dev/zero为0源) 但是这样为实际写入硬盘,文件产生速度取决于硬盘读写速度,如果欲产生超大文件,速度很慢 在某种场景下,我们只想让文件系统认为存在一个超大文件在此,但是并不实际写入硬盘 则可以dd if=/dev/zero of=test bs=1M count=0 seek=100