当前位置:网站首页>只有1个字节的文件实际占用多少磁盘空间
只有1个字节的文件实际占用多少磁盘空间
2020-11-06 21:04:00 【张彦飞allen】
在前文《新建一个空文件是否占用磁盘空间?占用多少》中我们了解到了一个空文件的磁盘开销。 今天我们再思考另外一个问题,假如我们给文件里只写入1个字节,那么这个文件实际的磁盘占用也是1个字节吗?
查看1个字节的文件
和前文一样,先不谈原理,直接动手操作。
# mkdir tempDir
# cd tempDir
# du -h
0 .
# touch test
# du -h
0 .
在一个目录中创建了一个空的文件以后,通过du命令看到的该文件夹的占用空间并没有发生变化。这倒是符合我们之前的认识,因为空文件只占用inode。好,那让我们修改文件,添加一个字母
echo "a" > test
# du -h
4.0K .
保存后再次查看该目录的空间占用。我们发现由原来的0增加到了4K。 所以说,文件里的内容不论多小,哪怕是一个字节,其实操作系统也会给你分配4K的。哦,当然了还得再算前文中说到的inode和文件夹数据结构中存储的文件名等所用的空间。 所以,不要在你的系统里维护一大堆的碎文件。文件再小,占用磁盘其实一点都不少!
注意我的实验环境是在ext文件系统下进行的。如果是xfs可能表现会有些许出入。
继续讨论这个4K
再把linux源代码文件fs/ext2/ext2.h里关于inode的定义翻出来,我们找到结构体中定义的指向数据节点用的block数组:
struct ext2_inode {
......
__le32 i_block[EXT2_N_BLOCKS]; # 指向存储文件数据的块的数组
......
当文件没有数据需要存储的时候,这个数组都是空值。而当我们写入了1个字节以后,文件系统就需要申请block去存储了,申请完后,指针放在这个数组里。哪怕文件内容只有一个字节,仍然会分配一个整的Block,因为这是文件系统的最小工作单位。那么这个block大小是多大呢,ext下可以通过dumpe2fs查看。
#dumpe2fs -h /dev/mapper/vgroot-lvroot
......
Block size: 4096
在我的机器上,一个Block是4KB。
文件内容再大了怎么办
不知道你留意没,inode中定义的block数组大小呢,只有EXT2_N_BLOCKS个。我们再查看一下这个常量的定义,发现它是15,相关内核中定义如下:
#define EXT2_NDIR_BLOCKS 12
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
就按4K的block size来看,15个block只够存的下15*4=60K的文件。 这个文件大小相信你一定不满意,你存一个avi大片都得上G了。那Linux是怎么实现大文件存储的呢?嗯,其实上面宏的定义过程已经告诉你了,就是只有12个数组直接存block指针,其余的用来做间接索引(EXT2_IND_BLOCK),二级间接索引(EXT2_DIND_BLOCK)和三级索引(EXT2_TIND_BLOCK)。

这样,一个文件可以使用的空间就指数倍的扩展了。 文件小的时候,都用直接索引,磁盘IO少,性能好。文件大的时候,访问一个block可能得先进行三次的IO,性能略慢,不过有OS层面的页缓存、目录项缓存的加持,也还好。
结论
文件系统是按照块来管理的,所以不管你的文件多小,哪怕只有一个字节,都会消耗掉整整一个块。这个块大小可以通过dumpe2fs等命令来查看。如果想改变这个块大小怎么办?对不起,只能重新格式化。

开发内功修炼之硬盘篇专辑:
- 1.磁盘开篇:扒开机械硬盘坚硬的外衣!
- 2.磁盘分区也是隐含了技术技巧的
- 3.我们怎么解决机械硬盘既慢又容易坏的问题?
- 4.拆解固态硬盘结构
- 5.新建一个空文件占用多少磁盘空间?
- 6.只有1个字节的文件实际占用多少磁盘空间
- 7.文件过多时ls命令为什么会卡住?
- 8.理解格式化原理
- 9.read文件一个字节实际会发生多大的磁盘IO?
- 10.write文件一个字节后何时发起写磁盘IO?
- 11.机械硬盘随机IO慢的超乎你的想象
- 12.搭载固态硬盘的服务器究竟比搭机械硬盘快多少?
我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术理论,也不只介绍实践经验。而是把理论与实践结合起来,用实践加深对理论的理解、用理论提高你的技术实践能力。欢迎你来关注我的公众号,也请分享给你的好友~~~
版权声明
本文为[张彦飞allen]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4746202/blog/4703266
边栏推荐
- Analysis of query intention recognition
- JVM memory area and garbage collection
- Simple summary of front end modularization
- Wiremock: a powerful tool for API testing
- Python基础数据类型——tuple浅析
- axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios
- 一篇文章带你了解CSS3圆角知识
- Tool class under JUC package, its name is locksupport! Did you make it?
- ES6学习笔记(五):轻松了解ES6的内置扩展对象
- Classical dynamic programming: complete knapsack problem
猜你喜欢

Python基础数据类型——tuple浅析

MeterSphere开发者手册

Interface pressure test: installation, use and instruction of siege pressure test

2019年的一个小目标,成为csdn的博客专家,纪念一下

零基础打造一款属于自己的网页搜索引擎

Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】

Python基础变量类型——List浅析

Brief introduction of TF flags

Mongodb (from 0 to 1), 11 days mongodb primary to intermediate advanced secret

Not long after graduation, he earned 20000 yuan from private work!
随机推荐
ES6 essence:
Pattern matching: The gestalt approach一种序列的文本相似度方法
Python saves the list data
Architecture article collection
6.5 request to view name translator (in-depth analysis of SSM and project practice)
Save the file directly to Google drive and download it back ten times faster
小程序入门到精通(二):了解小程序开发4个重要文件
至联云解析:IPFS/Filecoin挖矿为什么这么难?
Recommendation system based on deep learning
比特币一度突破14000美元,即将面临美国大选考验
Thoughts on interview of Ali CCO project team
Keyboard entry lottery random draw
Did you blog today?
[event center azure event hub] interpretation of error information found in event hub logs
6.2 handleradapter adapter processor (in-depth analysis of SSM and project practice)
Mac installation hanlp, and win installation and use
6.1.2 handlermapping mapping processor (2) (in-depth analysis of SSM and project practice)
It's easy to operate. ThreadLocal can also be used as a cache
Lane change detection
Music generation through deep neural network