【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、删…

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

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

《系统爆破: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;…

计算机网络学习笔记

第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代…

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

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

ISP各模块功能介绍

--------声明&#xff0c;本文为转载整理------- ISP各个模块功能介绍&#xff1a; 各模块前后效果对比&#xff1a; 黑电平补偿&#xff08;BLC&#xff09; 在理想情况下&#xff0c;没有光照射的像素点其响应值应为0。但是&#xff0c;由于杂质、受热等其它原因的影响&…

前缀和练习

【模版】前缀和 【模板】前缀和_牛客题霸_牛客网 思路 要想快速找出某一连续区间的和&#xff0c;我们就要使用前缀和算法。 其实本质是再创建一个dp数组&#xff0c;每进一次循环加上原数组的值&#xff08;dp代表arr的前n项和&#xff09;&#xff1a; vector<int>…

3. 【Vue实战--孢子记账--Web 版开发】--登录大模块

从这篇文章开始我们就进入到了孢子记账的前端开发&#xff0c;在本专栏中我默认大家的电脑上都已经配置好了开发环境。下面我们一起开始编写孢子记账的Web版吧。 一、功能 登录大模块功能包括注册、登录和找回密码功能&#xff0c;在本篇文章中我只会展示注册界面的实现&…

【2024年华为OD机试】 (A卷,100分)- 端口合并(Java JS PythonC/C++)

一、问题描述 题目描述 有 M 个端口组 (1 < M < 10)&#xff0c; 每个端口组是长度为 N 的整数数组 (1 < N < 100)&#xff0c; 如果端口组间存在 2 个及以上不同端口相同&#xff0c;则认为这 2 个端口组互相关联&#xff0c;可以合并。 输入描述 第一行输入端…

73.矩阵置零 python

矩阵置零 题目题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a; 题解思路分析Python 实现代码代码解释提交结果 题目 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例…

基于华为ENSP的OSPF状态机、工作过程、配置保姆级别详解(2)

本篇技术博文摘要 &#x1f31f; 基于华为enspOSPF状态机、OSPF工作过程、.OSPF基本配置等保姆级别具体详解步骤&#xff1b;精典图示举例说明、注意点及常见报错问题所对应的解决方法 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我…

SOLID原则学习,接口隔离原则

文章目录 1. 定义2. 为什么要遵循接口隔离原则&#xff1f;3. 违反接口隔离原则的例子4. 遵循接口隔离原则的改进5. 总结 1. 定义 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09; 接口隔离原则是面向对象设计中的五大原则&#xff08;SOLID&#…