为什么文本文件为4kB?


47

由于某种原因,当我在OS X上制作文本文件时,除非空白,它始终至少为4kB。为什么是这样?大约有1字节的纯文本会存在4,000字节的元数据吗?

在此处输入图片说明


16
4096个字节,而不是4000
机械蜗牛

8
@Mechanicalsnail4095。您忘记了实际数据的一个字节
Tobias Kienzler 2013年

5
@Mechanicalsnail是s年,不是吗?xkcd.com/394 :P
tkbx13年

Answers:


52

文件系统的块大小必须为4 kB。将数据写入文件系统中包含的文件时,操作系统必须分配存储块以包含将要写入文件的数据。

通常,在创建文件系统时,该文件系统中包含的存储将分成固定大小的块。 这篇Wikipedia文章简要解释了此过程。

此文件的文件系统的基础块大小必须具有4K字节的块大小。该文件使用1个4K块,该块中只有一个字节包含实际数据。


10
注释:在Windows中,默认情况下显示实际文件大小,并且“选项”窗格中显示磁盘上的大小。
Joe Z.

这样一个块可以容纳不同的文件吗?
sudeepdino008 '18

@ sudeepdino008否,每个文件(至少)一个块(Linux的ext文件系统具有将多个文件放在一个块中的选项,但这是该规则的例外)
Ro-ee

13

所有文件系统都具有群集或块大小,或者可以分配以容纳文件的最小磁盘空间。即使实际文件大小小于群集/块大小,它仍然会占用一个群集或文件系统上的4K。群集大小取决于文件系统和文件系统选项。

Gilles所指出的,如果它包含零字节,则它使用零块/簇,而在典型的* nix文件系统上使用一个inode,这更好地回答了警告,“除非它是空白的”。


6
“即使文件大小为零字节,它仍然会占用一个集群。”实际上,没有:在典型的UNIX文件系统上,一个空文件消耗一个inode和零个块,并且没有与块不同的集群概念。
吉尔(Gilles)'所以

8

一个小实验可以帮助说明这一点:

首先,让我们看看我的根ext4(LVM)分区的实际块大小是多少:

[root@fedora17 blocksize]# dumpe2fs /dev/mapper/vg_fedora17-lv_root | grep -i "block size"
dumpe2fs 1.42.3 (14-May-2012)
Block size:               4096

预期的是4096(4 KiB)。现在,让我们创建三个文件:第一个为零字节,第二个为一个字节,第三个为4 KiB(块大小):

[root@fedora17 blocksize]# touch 0_bytes.bin
[root@fedora17 blocksize]# dd if=/dev/zero of=1_byte.bin bs=1 count=1
[root@fedora17 blocksize]# dd if=/dev/zero of=4096_bytes.bin bs=1 count=4096


现在,我们ls目录。我们使用该-s选项来查看分配的大小(最左侧的列),以1024字节的“块”为单位。
(ls并不知道实际的块大小是4096 —我们可以指定,--block-size但是可以通过该值缩放所有内容,我们也希望以字节为单位查看实际的文件大小)

[root@fedora17 blocksize]# ls -ls
total 8
0 -rw-r--r--. 1 root root    0 Jan 21 23:56 0_bytes.bin
4 -rw-r--r--. 1 root root    1 Jan 21 23:38 1_byte.bin
4 -rw-r--r--. 1 root root 4096 Jan 21 23:38 4096_bytes.bin

这里可以注意两点:

  • 零字节文件占用文件系统中的零块,确认了Giles所说的内容
  • 即使其他两个文件具有不同的文件大小,它们都占用4 * 1024 =一个4KiB ext4块。

稀疏文件

稀疏文件是带有大块零的文件。由于已知数据全为零,因此将其存储在磁盘上毫无意义。这样,文件的视在大小实际上可以大于磁盘上的大小。

内联数据

请注意,某些文件系统允许将内容非常小的文件存储在inode本身中。请参阅是否可以将数据直接存储在Unix / Linux文件系统上的inode中?


是的,您非常正确,文件系统用于存储有关文件内部存储信息的文件大小是4k。存储诸如从块的开头开始的文件的索引,块的索引和文件所利用的存储器的大小之类的东西,它们消耗了4k。此信息用于引用文件系统中的文本文件。
pvn

2
这是不正确的。您提到的文件元数据不会“吞噬”任何4KiB。这些结构是文件系统格式化开销的一部分。请参阅上面的答案以获取证明。如果您说的是真的,那么我的4096字节文件将需要多个块。
乔纳森·莱因哈特

文件系统中文件的指针(段号,blk否)是必须存储的东西,需要分配一个块。如果文本文件的内容非常少,无法容纳已分配给它的第一个块,则不需要第二个块分配。我同意整个4k不会用于元数据,并且会产生一些内部碎片。
pvn

2
我说没有了的4 KiB块大小的用于元数据。我认为我的例子证明了这一点。
乔纳森·莱因哈特

2
@pvn:乔纳森是对的。元数据存储在文件的inode中,该文件与用于存储文件数据的块是分开的。
机械蜗牛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.