【IO编程】空洞文件

空洞文件(Sparse File) 是一种特殊类型的文件,它允许在文件中创建“空洞”(即未分配实际存储空间的区域)。这些空洞在逻辑上表现为零字节,而实际上并未占用磁盘存储空间。空洞文件的作用在于数据库、日志文件、虚拟机磁盘镜像等需要大文件支持的场景,可以节省存储空间并提高文件操作效率。

空洞文件的特点
  1. 逻辑大小与物理大小不同:
    • 逻辑大小:文件的表面大小,通常由文件系统的元数据记录。
    • 物理大小:实际占用的磁盘存储空间。
    • 空洞文件的逻辑大小可能很大,但物理空间只存储非零数据部分。
  2. 空洞区域的内容为零:文件的“空洞”部分在读取时会返回零字节。
  3. 节省存储空间:空洞部分不实际写入磁盘,仅在需要时分配存储。
创建空洞文件

在 Linux 系统中(Linux 本身就提供了一些方法来创建空洞文件):

方法 1:使用 fallocate 命令

fallocate 是一个高效的工具,可以直接创建空洞文件。

fallocate -l 1G my_sparse_file# -l 1G:指定逻辑大小为 1GB。
# my_sparse_file:文件名。
方法 2:使用 dd 命令

dd 可以创建空洞文件,通过跳过写入操作生成空洞。

dd if=/dev/zero of=my_sparse_file bs=1 count=0 seek=1G# if=/dev/zero:从零字节设备读取输入。
# of=my_sparse_file:输出到文件。
# bs=1:指定块大小为 1 字节。
# count=0:实际写入为 0 块。
# seek=1G:跳过 1GB,制造空洞。
方法 3:使用 truncate 命令

truncate 命令直接修改文件的逻辑大小,而不分配存储。

truncate -s 1G my_sparse_file# -s 1G:设置文件大小为 1GB。
在编程中创建空洞文件

编程语言如 C 或 Python 也可以通过文件指针操作创建空洞文件。

C语言:通过 lseek 函数将文件指针移动到指定位置并写入数据,从而制造空洞文件。

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main() {int fd = open("sparse_file", O_WRONLY | O_CREAT, 0644);if (fd < 0) {perror("Error opening file");return 1;}off_t offset = 1024 * 1024 * 1024; // 1GBif (lseek(fd, offset, SEEK_SET) == -1) {perror("Error seeking");close(fd);return 1;}// 写入一个字节,创建逻辑大小为1GB的空洞文件if (write(fd, "", 1) != 1) {perror("Error writing");close(fd);return 1;}close(fd);printf("Sparse file created successfully.\n");return 0;
}

Python 的文件操作制造空洞文件。

with open("sparse_file", "wb") as f:f.seek(1024 * 1024 * 1024)  # 移动到 1GB 位置f.write(b"\0")             # 写入一个字节
print("Sparse file created successfully.")
检查文件是否为空洞文件

(默认在 Linux 系统下):
可以使用 ls 和 du 命令查看文件的逻辑大小与实际物理大小:

ls -lh my_sparse_file
du -h my_sparse_file# ls -lh:显示文件的逻辑大小。
# du -h:显示文件的实际物理大小。
$ truncate -s 1G sparse_file
$ ls -lh sparse_file
-rw-r--r-- 1 user user 1.0G Jan 12 00:00 sparse_file
$ du -h sparse_file
0       sparse_file# ls 显示文件逻辑大小为 1GB。
# du 显示文件实际占用空间为 0 字节(空洞部分未分配)。

空洞文件的实际应用场景有:

  • 虚拟机磁盘镜像:虚拟机磁盘文件通常是空洞文件,逻辑大小可能很大,但只分配存储实际使用部分。
  • 日志文件:大型日志文件会预留存储空间,但只有部分区域存储实际数据。
  • 数据库文件:数据库系统(如 MySQL、PostgreSQL)可能使用空洞文件优化磁盘空间分配。
  • 测试大文件操作:创建空洞文件用于测试大文件处理性能。

使用空洞文件的注意事项:

  1. 文件系统支持:并非所有文件系统都支持空洞文件。例如,NTFS、ext4 支持空洞文件,但 FAT32 不支持。
  2. 空洞部分读取为零:空洞部分读取时返回零字节,但不会实际从磁盘读取。
  3. 空洞文件可能被填满:如果向空洞部分写入数据,磁盘空间会被实际分配。当磁盘空间不足时,可能导致写入失败。
  4. 数据一致性:使用空洞文件时,确保文件的逻辑大小与物理大小符合预期,避免误读或数据丢失。

空洞文件是一种高效的文件存储方式,允许在逻辑大小和物理大小之间进行分离,从而节省磁盘空间。无论是通过命令行工具(如 truncate、dd、fallocate)还是编程语言(如 C、Python),都可以轻松创建空洞文件。在实际使用中,需关注文件系统支持和磁盘空间管理,以确保空洞文件的正确性和有效性,在许多场景中为预留下足够的空间,空洞文件的使用还是十分常见的。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

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

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

相关文章

linux--防火墙 iptables 双网卡 NAT 桥接

linux--防火墙 iptables 双网卡 NAT 桥接 1 介绍1.1 概述1.2 iptables 的结构 2 四表五链2.1 iptables 的四表filter 表&#xff1a;过滤规则表&#xff0c;默认表。nat 表&#xff1a;地址转换表。mangle 表&#xff1a;修改数据包内容。raw 表&#xff1a;原始数据包表。 2.2…

oracle闪回表

文章目录 闪回表案例1&#xff1a;&#xff08;未清理回收站时的闪回表--成功&#xff09;案例2&#xff08;清理回收站时的闪回表--失败&#xff09;案例3&#xff1a;彻底删除表&#xff08;不经过回收站--失败&#xff09;案例4&#xff1a;闪回表之后重新命名新表总结1、删…

Unity编程与游戏开发-编程与游戏开发的关系

游戏开发是一个复杂的多领域合作过程,涵盖了从创意构思到最终实现的多个方面。在这个过程中,技术、设计与美术三大核心要素相互交织,缺一不可。在游戏开发的过程中,Unity作为一款强大的跨平台游戏引擎,凭借其高效的开发工具和庞大的社区支持,成为了很多游戏开发者的首选工…

202506读书笔记|《飞花令·江》——余霞散成绮,澄江静如练,江梅一夜落红雪,便有夭桃无数开

202506读书笔记|《飞花令江》——余霞散成绮&#xff0c;澄江静如练&#xff0c;江梅一夜落红雪&#xff0c;便有夭桃无数开 摘录 《飞花令江》素心落雪编著&#xff0c;飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”&#xff0c;类似于行酒令&#xff0c;是文人…

Android 13 framework方法通过AIDL方式供三方APP使用

增加接口服务供外部调用diff --git a/frameworks/base/core/api/current.txt b/frameworks/base/core/api/current.txt index 6eeeb7dcb5..2b6445eed8 100644 --- a/frameworks/base/core/api/current.txtb/frameworks/base/core/api/current.txt-4590,6 4590,14 package andr…

《系统爆破:MD5易破,后台登录可爆破?》

声明&#xff1a;笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 爆破Sales系统 一、爆破MD5 场景&#xff1a;已知MD5的加密字符串&#xff0c;如何得知明…

Copula算法原理和R语言股市收益率相依性可视化分析

阅读全文&#xff1a;http://tecdat.cn/?p6193 copula是将多变量分布函数与其边缘分布函数耦合的函数&#xff0c;通常称为边缘。在本视频中&#xff0c;我们通过可视化的方式直观地介绍了Copula函数&#xff0c;并通过R软件应用于金融时间序列数据来理解它&#xff08;点击文…

DSP+Simulink——点亮LED灯(TMSDSP28379D)超详细

实现功能&#xff1a;DSP28379D-LED灯闪烁 :matlab为2019a :环境建立见之前文章 Matlab2019a安装C2000 Processors超详细过程 matlab官网链接&#xff1a; Getting Started with Embedded Coder Support Package for Texas Instruments C2000 Processors Overview of Creat…

APP上架之Android 证书 MD5 指纹

Android 证书 MD5 指纹 1. 什么是 Android 证书 MD5 指纹&#xff1f; Android 证书 MD5 指纹是对证书数据进行 MD5 哈希运算后得到的 128 位字符串。在 Android 开发中&#xff0c;每个证书在理论上都有一个唯一的 MD5 指纹&#xff0c;用于识别和验证证书的有效性。证书指纹…

【Rust自学】11.6. 控制测试运行:并行和串行(连续执行)测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.6.1. 控制测试的运行方式 cargo test和cargo run一样&#xff0c;cargo test也会编译代码并生成一个二进制文件用于测试&#xff0c;…

Flutter 实现验证码输入框学习

学习flutter代码 实现一个用于输入验证码的自定义组件&#xff0c;它允许用户输入固定长度的验证码&#xff0c;并在输入完成时触发回调。 前置知识点学习 TextStyle TextStyle 是 Flutter 中用于定义文本样式的类。它提供了一组属性来控制文本的外观&#xff0c;如字体大小、…

解决ERROR: This version of pnpm requires at least Node.js xxx 的问题

1. 复现错误 今天从gitee下载某项目,用来学习前端开发,在执行 npm i -g pnpm命令时,虽然没有报错,但出现不分警告,暂忽略这些警告,执行如下命令时,却报出错误: PS C:\test> pnpm i ERROR: This version of pnpm requires at least Node.js v18.12 The current vers…

计算机网络学习笔记

第1课 绪论、传输介质 【知识点回顾】 两种导线可以减小电磁干扰&#xff1a; 双绞线&#xff08;分为非屏蔽双绞线、屏蔽双绞线&#xff09;&#xff08;RJ-45用&#xff09;同轴电缆&#xff08;短距离使用&#xff09;网络通信的基本单位&#xff1a;位&#xff08;bit&…

STM32之CAN通讯(十一)

STM32F407 系列文章 - CAN通讯&#xff08;十一&#xff09; 目录 前言 一、CAN 二、CAN驱动电路 三、CAN软件设计 1.CAN状态初始化 2.头文件相关定义 3.接收中断服务函数 4.用户层使用 1.用户层相关定义 2.发送数据 3.接收数据 1.查询方式处理 2.中断方式处理 3…

Java聊天小程序

拟设计一个基于 Java 技术的局域网在线聊天系统,实现客户端与服务器之间的实时通信。系统分为客户端和服务器端两类,客户端用于发送和接收消息,服务器端负责接收客户端请求并处理消息。客户端通过图形界面提供用户友好的操作界面,服务器端监听多个客户端的连接并管理消息通…

C#Halcon找线封装

利用CreateMetrologyModel封装找线工具时&#xff0c;在后期实际应用调试时容易把检测极性搞混乱&#xff0c;造成检测偏差&#xff0c;基于此&#xff0c;此Demo增加画线后检测极性的指引&#xff0c;首先看一下效果 加载测试图片 画线 确定后指引效果 找线效果 修改显示 UI代…

在php中,Fiber、Swoole、Swow这3个协程都是如何并行运行的?

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

component-动态控制 div width 的值 根据传入的变量决定width的值 vue

1.实现 根据参数的值&#xff0c;div显示不同的长度 <div class"node-line" :style"lineProgress"></div> <script>export default {name: "trainSummaryInfo",data(){return{linePercentage:200,}},computed:{lineProgress…

P9748 [CSP-J 2023] 小苹果

[CSP-J 2023] 小苹果 题目描述 小 Y 的桌子上放着 n n n 个苹果从左到右排成一列&#xff0c;编号为从 1 1 1 到 n n n。 小苞是小 Y 的好朋友&#xff0c;每天她都会从中拿走一些苹果。 每天在拿的时候&#xff0c;小苞都是从左侧第 1 1 1 个苹果开始、每隔 2 2 2 个…

【linux系统之redis6】redis的基础命令使用及springboot连接redis

redis的基础命令很多&#xff0c;大部分我们都可以在官网上找到&#xff0c;真的用的时候可以去官网找&#xff0c;不用全部记住这些命令 redis通用的基础命令的使用 代码测试 string类型常见的命令 key值的结构&#xff0c;可以区分不同的需求不同的业务名字 hash类型 创建…