Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >只有1个字节的文件实际占用多少磁盘空间

只有1个字节的文件实际占用多少磁盘空间

作者头像
范蠡
发布于 2020-12-15 02:53:40
发布于 2020-12-15 02:53:40
81300
代码可运行
举报
运行总次数:0
代码可运行
今天我们思考一个问题,假如我们给文件里只写入1个字节,那么这个文件实际的磁盘占用多大,难道真的是1个字节吗?

1

查看1个字节的文件

和前文一样,先不谈原理,直接动手操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# mkdir tempDir
# cd tempDir
# du -h
0    .
# touch test
# du -h
0    .

在一个目录中创建了一个空的文件以后,通过du命令看到的该文件夹的占用空间并没有发生变化。这符合我们之前的认识,因为空文件只占用inode。好,那让我们修改文件,添加一个字母

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo "a" > test
# du -h
4.0K    .

保存后再次查看该目录的空间占用。我们发现由原来的0增加到了4K。 所以说,文件里的内容不论多小,哪怕是一个字节,其实操作系统也会给你分配4K的。哦,当然了还得再算前文中说到的inode和文件夹数据结构中存储的文件名等所用的空间。 所以,不要在你的系统里维护一大堆的碎文件。文件再小,占用磁盘其实一点都不少!

注意我的实验环境是在ext文件系统下进行的。如果是xfs可能表现会有些许出入。

2

继续讨论这个4K

再把linux源代码文件fs/ext2/ext2.h里关于inode的定义翻出来,我们找到结构体中定义的指向数据节点用的block数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ext2_inode {
    ......
    __le32  i_block[EXT2_N_BLOCKS]; # 指向存储文件数据的块的数组
    ......

当文件没有数据需要存储的时候,这个数组都是空值。而当我们写入了1个字节以后,文件系统就需要申请block去存储了,申请完后,指针放在这个数组里。哪怕文件内容只有一个字节,仍然会分配一个整的Block,因为这是文件系统的最小工作单位。那么这个block大小是多大呢,ext下可以通过dumpe2fs查看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#dumpe2fs -h /dev/mapper/vgroot-lvroot
......
Block size:               4096

在我的机器上,一个Block是4KB。

3

文件内容大了怎么办?

不知道你留意没,inode中定义的block数组大小呢,只有EXT2_N_BLOCKS个。我们再查看一下这个常量的定义,发现它是15,相关内核中定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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)。

图1 inode中的直接与间接索引

这样,一个文件可以使用的空间就指数倍的扩展了。 文件小的时候,都用直接索引,磁盘IO少,性能好。文件大的时候,访问一个block可能得先进行三次的IO,性能略慢,不过有OS层面的页缓存、目录项缓存的加持,也还好。

4

结论

文件系统是按照inode+block来组织的,所以不管你的文件多小,哪怕只有一个字节,在数据上都会消耗掉整整一个块(当然还得算上inode等开销)。这个块大小可以通过dumpe2fs等命令来查看。如果想改变这个块大小怎么办?对不起,只能重新格式化。

再扯的远一点,所有的文件系统理念都是按照块来分配的,包括分布式文件系统,例如HDFS。由于HDFS应用场景是各种GB、TB甚至是PB级别的数据处理。所以为了降低block的管理成本,它的block size设置的非常大。在比较新的版本里,一个block直接就是128M,你没看错,单位是M。 所以如果你没有block的概念,天天在HDFS上都保存一堆KB级别的小文件,就等着去财务处领钱吧!

代码语言:javascript
代码运行次数:0
运行
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高性能服务器开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS网络——SDWebImage SDImageDownloader源码解析你要知道的NSURLSession都在这里
你要知道的NSURLSession都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本系列文章主要讲解iOS中网络请求类NSURLSession的使用方法进行详解,同时也会以此为扩展,讲解SDWebImage中图片下载功能的源码分析,讲解AFNetworking相关源码分析。本系列文章主要分为以下几篇进行讲解,读者可按需查阅。 iOS网络——NSURLSession详解及SDWebImage源码解析 iOS网络——SDWebImage
WWWWDotPNG
2018/04/10
1.7K0
iOS网络——AFNetworking AFURLSessionManager源码解析
你要知道的NSURLSession都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本系列文章主要讲解iOS中网络请求类NSURLSession的使用方法进行详解,同时也会以此为扩展,讲解SDWebImage中图片下载功能的源码分析,讲解AFNetworking相关源码分析。本系列文章主要分为以下几篇进行讲解,读者可按需查阅。 iOS网络——NSURLSession详解及SDWebImage源码解析 iOS网络——SDWebImage
WWWWDotPNG
2018/04/10
4.5K0
iOS开发·网络请求方法总结复习(NSURLConnection,NSURLSession,AFNetworking)
iOS的开发中的网络下载方式包括NSData(最原始,实际开发基本不会用),NSURLConnection(古老又过气的苹果原生网络框架),NSURLSession(现在流行的苹果网络框架),AFNetworking,SDWebImage以及基于AFNetworking的二次封装框架例如XMNetworking,HYBNetworking等等。
陈满iOS
2018/09/10
3.6K0
iOS开发·网络请求方法总结复习(NSURLConnection,NSURLSession,AFNetworking)
从AFNetworking源码分析到应用全解 原
    AFNetworking是iOS/OS开发中常用的一个第三方网络库,可以说它是目前最流行的网络库,但其代码结构其实并不复杂,也可以说非常简洁优美。在AFNetworking中,大量使用的线程安全的开发技巧,读此源码也是一次很好的多线程学习机会。本篇博客从主要结构和网络请求的主流程进行分享,解析了AFNetworking的设计思路与工作原理,后面还有其中提供的UI扩展包的接口应用总结。
珲少
2018/08/15
3.3K0
从AFNetworking源码分析到应用全解
                                                                            原
IOS开发系列——NSUrlSession专题
http://blog.csdn.net/qq_29846663/article/details/68961167
江中散人_Jun
2023/10/11
6770
IOS开发系列——NSUrlSession专题
NSURLSession 所有的都在这里(二)
前面一篇我们说了什么? ----       这是这个关于NSURLSession的第二篇文章,第一篇再加上这篇文章,就大概的把NSURLSession的API以及一些简单使用我们也就说的差不多了,这篇文章总结哪些点呢?相信看顾哦第一篇文章的小伙伴都知道,在开始写这篇文章之前我们说说上一篇文章我们写了些什么。       1、NSURLRequest       2、NSURLSession 3、NSURLSessionTask 以及它的三个子类:NSURLSessionDataTask/NSURLSes
Mr.RisingSun
2018/05/28
2K0
iOS复习中有关SDWebImage可能知识点总结(2)
分为内存缓存(利用SDImageCache类的NSCache属性),磁盘缓存(利用NSFileManager),和操作缓存(利用runtime关联的字典属性)。下载之前先查询缓存,没有就下载并在下载后保存图片到缓存。
陈满iOS
2018/09/10
8760
iOS复习中有关SDWebImage可能知识点总结(2)
iOS网络编程之二——NSURLSession的简单使用
    在iOS7之后,NSURLSession作为系统推荐使用的HTTP请求框架,在进行前台请求的情况下,NSURLSession与NSURLConnection并无太大差异,对于后台的请求,NSURLSession更加灵活的优势就将展现无遗。
珲少
2018/08/16
1K0
iOS网络--『文件下载、断点下载』的实现(二):NSURLSession
本文首发于我的个人博客:『不羁阁』 https://bujige.net 文章链接:https://bujige.net/blog/iOS-Resume-Download-NSURLSession.html 目录 NSURLSession下载简介 NSURLSession下载相关 2.1 NSURLSession(block方法) 2.2 NSURLSession(代理方法) 2.3 NSURLSession(断点下载 | 不支持离线) 2.4 NSURLSession(断点下载 |
程序员充电站
2018/05/31
2.3K0
iOS网络——AFNetworking AFHttpSessionManager源码解析
你要知道的NSURLSession都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本系列文章主要讲解iOS中网络请求类NSURLSession的使用方法进行详解,同时也会以此为扩展,讲解SDWebImage中图片下载功能的源码分析,讲解AFNetworking相关源码分析。本系列文章主要分为以下几篇进行讲解,读者可按需查阅。 iOS网络——NSURLSession详解及SDWebImage源码解析 iOS网络——SDWebImage
WWWWDotPNG
2018/04/10
1.6K0
[iOS源码笔记]·第三方网络图片处理框架:SDWebImage网络下载及缓存管理策略
typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL);
陈满iOS
2018/09/10
2.3K0
[iOS源码笔记]·第三方网络图片处理框架:SDWebImage网络下载及缓存管理策略
AFNetworking 源码阅读(v3.2.1)
AFNetworking项目地址 https://github.com/AFNetworking/AFNetworking 下载打开后目录 AFNetworking 1.AFNetwork
用户2215591
2018/07/05
2.2K0
NSURLSession与NSURLConnection区别
2017-05-0217:47:05 发表评论 425℃热度 使用现状 普通任务和上传 下载任务方式 请求方法的控制 断点续传的方式 配置信息 NSURLSessionDataTask NSURLSessionDownloadTask NSURLSessionUploadTask 结语 目录 今天去面试,被问了一道AFNetworking2.0和3.0有什么区别,当时心想,这谁不知道啊,随口答到:2.0使用的NSURLConnection,3.0使用的是NSURLSession,人家又
timhbw
2018/05/03
1.6K0
SDWebImage源码阅读-第一篇
一 题外话   之前写过一篇最新版SDWebImage的使用,也简单的介绍了一下原理。这两天正梳理自己的知识网络,觉得有必要再阅读一下源码,一是看具体实现,二是学习一下优秀开源代码的代码风格,比如接口设计,设计模式,变量命名等等。   既然是第一篇,就要制定一个阅读源码的计划,以什么顺序阅读完全部代码。我们从最常见的入口切入sd_setImageWithURL,一路下去,最后再阅读没有设计到的部分。   在开始之前强烈建议先去读我之前的文章:最新版SDWebImage的使用。心里有个大概再去探讨细节,效果更
王大锤
2018/05/17
8270
iOS SDWebimage 源码阅读
简介 SDWebimage是 iOS 的图片加载框架。它支持从网络中下载且缓存图片,并设置图片到对应的 UIImageView 控件或者 UIButton 控件。在项目中使用 SDWebImage 来管理图片加载相关操作可以极大地提高开发效率,让我们更加专注于业务逻辑实现。
赵哥窟
2018/12/18
1.3K0
【IOS】总结-AFNetworking学习笔记
NSURLConnection 是 Foundation URL 加载系统的基石。一个 NSURLConnection 异步地加载一个 NSURLRequest 对象,调用 delegate 的 NSURLResponse / NSHTTPURLResponse 方法,其 NSData 被发送到服务器或从服务器读取;delegate 还可用来处理 NSURLAuthenticationChallenge、重定向响应、或是决定 NSCachedURLResponse 如何存储在共享的 NSURLCache上。
江中散人_Jun
2022/03/08
1.6K0
Kingfisher源码阅读(二)
上次说到了downloadAndCacheImageWithURL这个方法,看名字就知道既要下载图片又要缓存图片,它的方法体是这样的:
Sheepy
2018/09/10
8330
Kingfisher源码阅读(二)
iOS AFNetworking 源码阅读二
当解析错误,我们直接调用传进来的fauler的Block失败返回了,这里有一个self.completionQueue,这个是我们自定义的,这个是一个GCD的Queue如果设置了那么从这个Queue中回调结果,否则从主队列回调。
赵哥窟
2018/12/17
1.8K0
iOS AFNetworking 源码阅读二
iOS开发·由SDWebImage引发的知识点聚合与思考(最新呕心沥血之作)
学习iOS的各种知识点,例如runloop,只懂原理不行,要清楚明白它的应用场景才是真懂;学习SDWebImage的框架源码,只看SDWebImage的业务逻辑,也不是真懂。有效的学习是不断的问问题,挖掘并总结SDWebImage它这些场景涉及到的知识点,然后再模仿它,结合那些场景去写出这个知识点才是真懂。据我所观察SD涉及到的知识点就有:runloop的mode切换,runtime的关联对象,多线程NSOperation的开始与挂起,网络操作里面NSURLSession与NSURLConnection的区别,关于缓存的NSCache,NSFileManager操作,等等。
陈满iOS
2018/09/10
2.1K0
iOS开发·由SDWebImage引发的知识点聚合与思考(最新呕心沥血之作)
iOS-网络编程(二)文件上传和断点离线下载
一. iOS中发送HTTP请求的方案 在iOS中,我们常用发送HTTP请求的方案有 苹果原生(自带) NSURLConnection:用法简单,最古老最经典最直接的一种方案 (iOS 9.0弃用) NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术 第三方框架AFNetworking:简单易用,提供了基本够用的常用功能,维护和使用者多 二. NSURLConnection (已弃用) 虽然NSURLConnection已经被弃用,但是我们还是要了解N
xx_Cc
2018/05/10
2.4K0
推荐阅读
相关推荐
iOS网络——SDWebImage SDImageDownloader源码解析你要知道的NSURLSession都在这里
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验