Чомусь, коли я створюю текстовий файл на OS X, це завжди принаймні 4 КБ, якщо тільки він порожній. Чому це? Чи може бути 4000 байт метаданих приблизно 1 байт простого тексту?
:P
Чомусь, коли я створюю текстовий файл на OS X, це завжди принаймні 4 КБ, якщо тільки він порожній. Чому це? Чи може бути 4000 байт метаданих приблизно 1 байт простого тексту?
:P
Відповіді:
Розмір блоку файлової системи повинен бути 4 кБ. Коли дані записуються у файл, який міститься у файловій системі, операційна система повинна виділити блоки зберігання, щоб містити дані, які будуть записані у файл.
Зазвичай при створенні файлової системи сховище, що міститься в цій файловій системі, сегментується на блоки фіксованого розміру. Ця стаття у Вікіпедії коротко пояснює цей процес.
Розмір основного блоку файлової системи для цього файлу повинен мати розмір блоку 4 К байт. Цей файл використовує 1 4K блок, і лише один байт всередині цього блоку містить фактичні дані.
Усі файлові системи мають розмір кластера або блоку або найменший обсяг дискового простору, який можна виділити для вміщення файлу. Навіть якщо фактичний розмір файлу менший за розмір кластера / блоку, він все одно буде споживати один кластер або 4K у вашій файловій системі. Розмір кластера залежить від файлової системи та параметрів файлової системи.
Якщо він містить нульові байти, як зазначив Гілл , він використовує нульові блоки / кластери, але один inode в типових * 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 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-байтних "блоків".
(Якщо я не знаю, реальний розмір блоку - 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? .