Каталог использует больше места, чем ожидалось

У меня есть каталог на Ubuntu, который содержит 262144 файлов. Каждый файл представляет собой изображение размером 25x25 png. В среднем эти файлы составляют приблизительно 1,14 КБ, и ни один файл не превышает 2 КБ. Тем не менее, этот каталог занимает 3,1 ГБ дискового пространства. Как это возможно? По моим расчетам этот каталог должен использовать 262144 * 1140 = 298844160 bytes, который является только 0.298844 GB,

Вот шаги, которые я следовал, чтобы получить эту информацию.

Я побежал ls -1 -f | wc -l посчитать количество файлов в каталоге. Это возвращает 262146 (То есть, 262144 + 1 + 1 за . а также ..).

Затем я побежал find . -size +2k и результат был просто .,

Наконец я побежал du -sh culprit_directory и результат показывает 3.1G culprit_directory,

Я думаю, что может произойти две вещи:

  1. Ubuntu требуется дополнительное пространство для хранения каталога, который содержит очень большое количество очень маленьких файлов. Возможно, но целый порядок?
  2. Я делаю ошибку в моих расчетах, и это ожидаемый размер каталога. Также возможно, но я не могу увидеть, где я сделал эту ошибку.

Если бы кто-то с большим опытом работы с внутренним хранилищем файлов Ubuntu мог бы посоветовать мне, я был бы очень признателен.

РЕДАКТИРОВАТЬ: я добавил один из файлов PNG. Этот 591 bytes по размеру.

Пример одного из файлов png

РЕДАКТИРОВАТЬ:

Благодаря полезным комментариям ниже, я определил, что каждый файл на самом деле использует 12KB на диске, даже если он состоит всего из нескольких сотен байтов. Используя новые номера, получаем 262144 * 12000 = 3145728000, что дает нам 3.145728GB,

Думаю, мой новый вопрос будет состоять в том, как избежать использования каждого файла так много места?

2 ответа

Решение

Отвечая на дополнительный вопрос, вероятно, в этих случаях проще всего создать небольшую специальную файловую систему и смонтировать ее. Что-то вроде этого:

$ dd if=/dev/zero of=imgdisk.img bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 0.425628 s, 1.3 GB/s
$ du -h imgdisk.img 
513M    imgdisk.img
$ mkfs.ext4 -b 2048 imgdisk.img 
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done                            
Creating filesystem with 262144 2k blocks and 32768 inodes
Filesystem UUID: 8837a733-6b75-4326-bb72-9372538653ad
Superblock backups stored on blocks: 
        16384, 49152, 81920, 114688, 147456

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 

$ mkdir imgmount
$ sudo mount imgdisk.img imgmount -o loop
$ ls imgmount/
lost+found

скопируйте туда изображения (размер которых может быть слишком мал для ваших файлов; сделайте 512 a 513, если это так), umount файловая система цикла, смонтируйте ее над каталогом со всеми образами. Если это работает, umount это оттуда, удалить оригинальные изображения, редактировать /etc/fstab поэтому он монтирует петлевую файловую систему в нужном месте, mount -a и все готово

Изменить: вы можете использовать -b 1024 вместо 2048 тоже.

Разные программы сообщают о разной статистике использования дискового пространства двумя способами. Файлы могут иметь размер, который представляет собой число байтов в файле, и "физический размер", который представляет собой сумму размеров кластера, используемого этим файлом. Физический размер, или "размер кластера" - это минимальный блок, который ОС отслеживает при обращении к пространству, используемому на диске. Таким образом, если у вас есть один файл, содержащий 1 байт, и размер кластера составляет 8 килобайт, файл использует минимум 1 кластер или 8 КБ.

Потерянное дисковое пространство обычно не является проблемой, даже если размеры дисков увеличиваются, а размеры кластеров увеличиваются до 32 или 64 КБ.

 guess my new question would be how to avoid each file using so much space?

Поместите файлы, которые используются меньше, в архивный файл, например файл.zip. ОС имеет ограничение на количество кластеров, которые она может отслеживать.

Может быть, кто-то еще может объяснить ограничение размера кластера для нескольких ОС.

Другие вопросы по тегам