Почему текстовый файл занимает по крайней мере 4 КБ, даже если в нем всего один байт текста?


47

По какой-то причине, когда я делаю текстовый файл в OS X, он всегда имеет размер не менее 4 КБ, если только он не пуст. Почему это? Может ли быть 4000 байтов метаданных на 1 байт простого текста?

введите описание изображения здесь


17
4096 байт, а не 4000.
Механическая улитка

9
@Mechanicalsnail 4095. Вы забыли один байт фактических данных
Тобиас Кинцлер,

6
@Mechanicalsnail это високосный год, не так ли? xkcd.com/394 :P
tkbx

Ответы:


52

Размер блока файловой системы должен составлять 4 КБ. Когда данные записываются в файл, содержащийся в файловой системе, операционная система должна выделить блоки хранения для хранения данных, которые будут записаны в файл.

Обычно при создании файловой системы хранилище, содержащееся в этой файловой системе, сегментируется на блоки фиксированного размера. Эта статья в Википедии кратко объясняет этот процесс.

Размер базового блока файловой системы для этого файла должен иметь размер блока 4 КБ. Этот файл использует 1 4K блок, и только один байт в этом блоке содержит фактические данные.


10
Комментарий: в Windows фактический размер файла отображается по умолчанию, а размер на диске отображается на панели параметров.
Джо З.

так может ли блок вместить разные файлы?
sudeepdino008

@ sudeepdino008 нет, по одному блоку (как минимум) для каждого файла (в файловой системе ext Linux есть / была (?) опция для размещения нескольких файлов в одном блоке, но это исключение из правила)
Роэ,

13

Все файловые системы имеют размер кластера или блока или минимальный объем дискового пространства, которое может быть выделено для хранения файла. Даже если фактический размер файла меньше размера кластера / блока, он все равно будет использовать один кластер или 4 КБ в вашей файловой системе. Размер кластера зависит от файловой системы и параметров файловой системы.

Если он содержит ноль байтов, как указал Жиль , он использует ноль блоков / кластеров, но один индекс в типичных файловых системах * nix, что лучше отвечает предупреждению, «если только оно не пусто».


6
«Даже если размер файла равен нулю в байтах, он все равно будет занимать один кластер». На самом деле нет: в типичных файловых системах Unix пустой файл потребляет один инод и ноль блоков, и нет понятия кластера, который отличается от блоков.
Жиль "ТАК - перестань быть злым"

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 КиБ), как и ожидалось. Теперь давайте создадим три файла: первый - ноль байтов, второй - всего один байт, а третий - 4 КиБ (размер блока):

[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

Здесь можно отметить две вещи:

  • Файл с нулевым байтом занимает нулевые блоки в файловой системе, подтверждая сказанное Джайлсом .
  • Хотя два других файла имеют разные размеры, они оба занимают 4 * 1024 = один блок 4 КБ ext4.

Редкие файлы

Разреженные файлы - это файлы с большими блоками нулей. Поскольку известно, что все данные равны нулю, нет смысла хранить их на диске. Таким образом, видимый размер файла на самом деле может быть больше, чем размер на диске.

Встроенные данные

Обратите внимание, что некоторые файловые системы позволяют хранить содержимое очень маленьких файлов в самом inode . См. Возможно ли хранить данные непосредственно внутри inode в файловой системе Unix / Linux? ,


Да, вы совершенно правы, 4k - это размер, который файловая система использует для хранения информации о хранилище файла внутри файловой системы. Вещи, такие как индекс файла от начала блока, индекс блока и размер памяти, используемой файлом, сохраняются, которые съедают 4 КБ. Эта информация используется для ссылки на текстовый файл из файловой системы.
pvn

3
Это неверно Файловые метаданные, которые вы упоминаете, не "съедают" ни один из 4KiB. Эти структуры являются частью накладных расходов форматирования файловой системы. Смотрите мой ответ выше для доказательства. Если то, что вы сказали, было правдой, тогда моему 4096-байтовому файлу понадобилось бы более одного блока.
Джонатон Рейнхарт

Указатели на файл (номер сегмента, блк нет) в файловой системе - это те вещи, которые должны быть сохранены и требуют назначения одного блока. Если в текстовом файле содержится очень мало содержимого, которое может поместиться в первом блоке, уже назначенном ему, то для него не потребуется выделение второго блока. Я согласен, что весь 4k не используется для метаданных и возникает некоторая внутренняя фрагментация.
pvn

3
Я говорю, что ни один из блоков размером 4 КиБ не используется для метаданных. Я думаю, что мой пример доказывает это.
Джонатон Рейнхарт

3
@pvn: Джонатон прав. Метаданные хранятся в inode для файла, который отделен от блока, используемого для хранения данных файла.
Механическая улитка
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.