По какой-то причине, когда я делаю текстовый файл в OS X, он всегда имеет размер не менее 4 КБ, если только он не пуст. Почему это? Может ли быть 4000 байтов метаданных на 1 байт простого текста?
:P
По какой-то причине, когда я делаю текстовый файл в OS X, он всегда имеет размер не менее 4 КБ, если только он не пуст. Почему это? Может ли быть 4000 байтов метаданных на 1 байт простого текста?
:P
Ответы:
Размер блока файловой системы должен составлять 4 КБ. Когда данные записываются в файл, содержащийся в файловой системе, операционная система должна выделить блоки хранения для хранения данных, которые будут записаны в файл.
Обычно при создании файловой системы хранилище, содержащееся в этой файловой системе, сегментируется на блоки фиксированного размера. Эта статья в Википедии кратко объясняет этот процесс.
Размер базового блока файловой системы для этого файла должен иметь размер блока 4 КБ. Этот файл использует 1 4K блок, и только один байт в этом блоке содержит фактические данные.
Все файловые системы имеют размер кластера или блока или минимальный объем дискового пространства, которое может быть выделено для хранения файла. Даже если фактический размер файла меньше размера кластера / блока, он все равно будет использовать один кластер или 4 КБ в вашей файловой системе. Размер кластера зависит от файловой системы и параметров файловой системы.
Если он содержит ноль байтов, как указал Жиль , он использует ноль блоков / кластеров, но один индекс в типичных файловых системах * nix, что лучше отвечает предупреждению, «если только оно не пусто».
Небольшой эксперимент, чтобы проиллюстрировать это:
Во-первых, давайте посмотрим, каков фактический размер блока моего корневого раздела 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
Здесь можно отметить две вещи:
Разреженные файлы - это файлы с большими блоками нулей. Поскольку известно, что все данные равны нулю, нет смысла хранить их на диске. Таким образом, видимый размер файла на самом деле может быть больше, чем размер на диске.
Обратите внимание, что некоторые файловые системы позволяют хранить содержимое очень маленьких файлов в самом inode . См. Возможно ли хранить данные непосредственно внутри inode в файловой системе Unix / Linux? ,