嵌入式Linux平台大文件生成以及处理方法

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

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

一、生成大文件命令

1、dd

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

语法如下:

dd if=[source] of=[destination] bs=[block-size] count=[counter]  

从 source 读取并拷贝内容到 destination, source 和 destination 都是文件,前者是读取的文件,后者是写入的文件。

  • bs: 表示块的大小,单位是字节,后缀中带了字母B的换算单位都是1000, 比如:1KB = 1000 Bytes1MB = 1000 * 1000 Bytes1GB = 1000 * 1000 * 1000 Bytes, 后缀省略了字母 B的换算单位是 1024, 比如:1K = 1024 Bytes、 1M = 1024 * 1024 Bytes1G = 1024 * 1024 * 1024 Bytes

  • count: 表示块的数量,表示 dd 命令需要执行多少次读取及写入的操作 bs 乘以 count 就表示目标文件的大小,也即需要创建的文件的大小

比如:下面的命令可以创建一个 10G 大小的文件

[root@localhost tmp]# dd if=/dev/zero of=testfile bs=1G count=10
10+0 records in
10+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 5.11256 s, 2.1 GB/s
[root@localhost tmp]# du -h testfile
10G     testfile

上面的命令表示从 /dev/zero文件每次读取 1G大小的数据并写入当前目录中的 testfile 文件, bs=1G表示块大小是1Gcount=10表示共有10个块, 所以目标文件最终的大小是: 1G * 10 = 10G

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

使用命令 du -h testfile 可以看出 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 -i eth1 -w /tmp/packet.pcap >/dev/null &

2、yes

dd 命令创建的是空字符的文件,如果想创建包含自定义的字符的文件,则可通过 yes 命令,它的作用是循环输出一行指定的字符串,直到进程结束;为了控制文件的大小并打破循环,我们借助 head 命令来实现。

使用 yes 命令创建包含指定内容文件的语法如下:

yes [string] | head -c [size of file] > [name of file]
  • string 是写入文件每一行的字符串

  • head -c [size of file] 是接收指定大小的字符串,单位是字节,后面也可以接 KKBMMBGGB等单位

如下示例是向文件 yesfile 写入,每行的内容是: This is my test file , 一直到文件大小达到 10G

[root@localhost 73]# yes "This is my test file" | head -c 10G > yesfile
[root@localhost 73]# du -h yesfile
10G     yesfile[root@localhost 73]# time yes "This is my test file" | head -c 10G > yesfilereal    0m6.635s
user    0m0.882s
sys     0m9.645s

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

3、fallocate

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

语法如下:

fallocate -l [size of file] [name of file] 
  • -l 选项表示文件大小,单位是字节,后面可以接 KKBMMBGGB等单位

如下示例是使用fallocate命令是创建一个 10G 大小的文件

[root@localhost 73]# time fallocate -l 10G falfilereal    0m0.027s
user    0m0.000s
sys     0m0.001s
[root@localhost 73]# du -h falfile
10G     falfile

这里通过time命令量测fallocate指令执行时所需消耗的时间及系统资源,从结果可以看出:fallocate命令创建一个 10G 大小的文件竟然只花费了 0.001 秒,速度可谓是极快的。

4、truncate

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

语法如下:

truncate -s [file-size] [name of the file]
  • -s 选项表示文件大小,单位是字节,跟 fallocate 命令一样,后面可以接 KKBMMBGGB等单位

如下示例为使用 truncate 命令创建一个 10G 大小的文件。

[root@localhost 73]# time truncate -s 10G trunfilereal    0m0.025s
user    0m0.000s
sys     0m0.001s
#查看文件实际占用磁盘空间大小
[root@localhost 73]# du -h trunfile
0       trunfile
#查看文件显示大小(逻辑大小)
[root@localhost 73]# ll -h trunfile
-rw-r--r-- 1 root root 10G Jul  3 04:41 trunfile

这里通过time命令量测fallocate指令执行时所需消耗的时间及系统资源,从结果可以看出,truncate命令创建一个10G的文件也只花费了 0.001 秒,和 fallocate 基本一样。但是, du -h trunfile 命令的结果显示 trunfile 大小为 0。

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

提示:

  • ls显示文件的“逻辑上”的size, 这不是文件真正占用磁盘空间大小,这部分空间也会被其他进程使用

  • du显示文件“物理上”的size,即du显示的size是文件在硬盘上占据了多少个block计算出来的

注意:fallocate 命令只支持 btrfs、ext4、 ocfs2、xfs 这几种文件系统,而 truncate 命令支持所有的现代文件系统。

二、优劣分析

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

  • dd                  5.1秒

  • yes                9.6秒

  • fallocate    0.001秒

  • truncate      0.001秒

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

  • dd   需要进行写文件操作,进行大量的IO

  • yes 需要进行写文件操作,进行大量的IO

  • fallocate 将空间分配给文件,但不会写入任何数据到文件中

  • truncate 创建的是稀疏文件,不会写入任何数据到文件中

ddyes都有写文件操作,而这需要大量的 IO 时间,所以同样创建10G的文件,它们比fallocatetruncate要慢很多。如果对生成文件的速度没有很高的要求且对内容无要求的情况下首选dd,如果希望自定义文件内容的话,则使用yes。如果想快速地生成超大文件,比如 1 秒内创建一个 100G 的文件,选择fallocatetruncate ,如果还需要确保文件是实际占用磁盘空间的话,则只能选择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@localhost test]# split -l 50000000 -d -a 3 yesfile yesfile_
[root@localhost test]# ls -l
total 20971536
-rw-r--r-- 1 root root 10737418240 Jun 30 09:28 yesfile
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_000
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_001
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_002
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_003
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_004
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_005
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_006
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_007
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_008
-rw-r--r-- 1 root root  1050000000 Jun 30 09:39 yesfile_009
-rw-r--r-- 1 root root   237418240 Jun 30 09:39 yesfile_010
[root@localhost test]#
[root@localhost test]# du -h yesfile_000
1002M   yesfile_000
[root@localhost test]# tail -5 yesfile_000
this is my test file
this is my test file
this is my test file
this is my test file
this is my test file
#按字节大小分割
[root@localhost test]# split -d -b 1G yesfile yes_
[root@localhost test]# ls
yes_00  yes_01  yes_02  yes_03  yes_04  yes_05  yes_06  yes_07  yes_08  yes_09  yesfile
[root@localhost test]# du -h yes_00
1.0G    yes_00
#指定输出文件后缀长度
[root@localhost test]# split -d -b 1G yesfile -a 3 yes_
[root@localhost test]# ls
yes_000  yes_001  yes_002  yes_003  yes_004  yes_005  yes_006  yes_007  yes_008  yes_009  yesfile

2、文件合并

在 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:等价于"-vE"选项;

  • -t:等价于"-vT"选项;

示例如下:

#把testfile的文档内容加上行号后输入yesfile这个文档里
[root@localhost tmp]# cat -n testfile > yesfile
#使用tail读取yesfile文件的末尾几行,第一列为行号
[root@localhost tmp]# tail yesfile
4993211 this is my test file
4993212 this is my test file
4993213 this is my test file
4993214 this is my test file
4993215 this is my test file
4993216 this is my test file
4993217 this is my test file
4993218 this is my test file
4993219 this is my test file
#将test目录下之前分割的小文件通过cat命令进行合并,重新生成yesfile文件
[root@localhost test]# cat yes_* > yesfile
#生成后的yesfile文件大小依然是10G
[root@localhost test]# du -h yesfile
10G     yesfile

四、总结

通过本文的介绍,我们了解了如何在Linux系统下进行大文件生成以及分割,并掌握了一些常见的技巧和注意事项。无论是处理大文件还是日志记录,都可以采用上述方法来提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杨中科 ASP.NET DI综合案例

综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…

第三百四十九回

文章目录 1. 概念介绍2. 原理与方法2.1 知识对比2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"加密包crypto"相关的内容,本章回中将介绍characters包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 在项目中会遇到获取字…

Django实战:部署项目 【资产管理系统】,Django完整项目学习研究(项目全解析,部署教程,非常详细)

导言 关于Django,我已经和大家分享了一些知识,考虑到一些伙伴需要在实际的项目中去理解。所以我上传了一套Django的项目学习源码,已经和本文章进行了绑定。大家可以自行下载学习,考虑到一些伙伴是初学者,几年前&#…

OpenAI又出王炸,Sora是否要开启视频AI新时代?

OpenAI又出王炸,Sora是否要开启视频AI新时代? 关注微信公众号 DeepGoAI 前几天我们还在讨论 如何让ChatGPT3.5变得更聪明 今天OpenAI就带着新王炸出现了 如同ChatGPT一般 在计算机领域掀起轩然大波 开启真正视频AI新时代 那就是 Sora 很多同学可…

结构体对齐规则及为什么会有结构体对齐

前言: 大家在学习结构体中,在计算结构体大小时想必会很疑惑,为什么结构体的大小不是按照常理像数组一样一个字节一个字节的挨在一起放?今天带大家一起深入探讨一下背后的规则和原因。 结构体对齐规则: 结构体对齐其实…

离散数学截图2

为什么G中阶大于2的元素,一定有偶数个 在有限群G中,阶大于2的元素个数一定是偶数的原因如下: 设 aaa 是群G中一个阶大于2的元素,那么根据群的定义和阶的概念(即某个元素的幂次使得其等于单位元的最小正整数&#xff…

【Linux】 Linux 小项目—— 进度条

进度条 基础知识1 \r && \n2 行缓冲区3 函数介绍 进度条实现版本 1代码实现运行效果 版本2 Thanks♪(・ω・)ノ谢谢阅读!!!下一篇文章见!!! 基础知识 1 \r &&a…

linux 安装docker

目录 环境 操作步骤 1 下载脚本 2 执行脚本 3 检查docker版本,证明安装成功 环境 阿里云 ubuntu 22.04 64位 操作步骤 参考linux系统安装docker-腾讯云开发者社区-腾讯云 (tencent.com) 1 下载脚本 curl -fsSL https://get.docker.com -o get-docker.sh …

牛客小白月赛87

说明 年后第一次写题,已经麻了,这次的题很简单但居然只写了两道题。有种本该发挥80分的水平,但是只做出了20分的水平的感觉。不过剩下几个题(除了G题),比完赛一小时内就AC了。欢迎大家交流学习。&#xff0…

OpenCV 笔记(22):图像的缩放——最近邻插值、双线性插值算法

1. 图像缩放 1.1 简介 图像缩放是指通过增加或减少像素来改变图像尺寸的过程,是图像处理中常见的操作。图像缩放会涉及效率和图像质量之间的权衡。 图像放大(也称为上采样或插值)的主要目的是放大原图像,以便在更高分辨率的显示设…

RK3568笔记十五:触摸屏测试

若该文为原创文章,转载请注明原文出处。 使用正点原子的ATK-RK3568板子,一直在测试屏幕和视频,突然想到触摸屏测试,一直没有用过,原子给的demo跑的是QT系统,触摸功能是正常的,测试一下&#xf…

学习天机02

1.注入bean的写法 构造函数的注入 2.回答和评论 在做这个功能的时候需要理解一些概念,张三提出问题就是提问者,李四去回答张三的问题,李四就是回答者,王五去回答李四的评论,王五就是评论者。 在提供的InteractionRep…

MySQL免安装版安装教程

官网下载安装包 MySQL :: Download MySQL Community Server (Archived Versions) 选择mysql版本下载 安装配置MySQL 将下载完的Mysql安装包解压到指定目录 打开windos系统的cmd,以管理员身份运行 进入mysql文件夹中的bin目录 安装MySQL的服务mysqld --install 初…

幻兽帕鲁游戏联机的时候,显示“网络连接超时”怎么解决?

如果你在游戏联机的时候,显示“网络连接超时”,可以检查下: 1、前提是你已经按照教程部署成功 2、检查防火墙有没有忘记设置,协议是UDP(只有TCP不行,一定要有UDP),端口是否填了8211&…

AI:128-基于机器学习的建筑物能源消耗预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

02 c++入门

目录 c关键字命名空间c输入&输出缺省参数函数重载引用内联函数auto关键字(c11)基于范围的for循环(c11)指针空值—nullptr(c11) 0. 本节知识点安排目的 c是在c的基础上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等…

【论文精读】DINO

摘要 基于对ViT在监督学习领域的表现质疑,探究自监督方法下的ViT是否具有更好的特征提取能力,进而发现: 自监督ViT特征包含场景布局、对象边界。这些信息可以在最后一自注意力模块中直接访问。自监督ViT特征结合最近邻分类器(k-NN)分类头中表…

java-8组合式异步编程

11.1 Future 接口 Future接口在Java5中被引人,设计初衷是对将来某个时刻会发生的结果进行建模。它建模了一种异步计算,返回一个执行运算结果的引用,当运算结束后,这个引用被返回给调用方。在Future中触发那些潜在耗时的操作把调用…

【VSCode】使用笔记

目录 快捷键系列 相关插件 相关文档链接 快捷键系列 调出终端 ctrl 或者是ctrlJ 结束进程 ctrlc 注释 ctrlkc 取消注释 ctrlku 上下移动代码 alt方向键 多行光标ctrlalt方向键 快速跳过某个单词 ctrl方向键 相关插件 1.每次修改后,自动保存启动项目 相…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱6(附带项目源码)

效果演示 文章目录 效果演示系列目录前言存储加载物品信息源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快…