Почему размер файла на диске отличается от размера в памяти

Если вы когда-нибудь замечали, что файл «весит» в проводнике одно, а в свойствах или диспетчере задач показывает другое — это не ошибка системы. Размер на диске и объём занимаемой памяти действительно могут различаться, причём в обе стороны. Главный принцип простой: размер файла — это количество данных в нём, а место на диске — то, что файловая система физически выделяет под эти данные. Между этими величинами стоят кластеры, сжатие, метаданные и разные системы счисления. Разберём каждый фактор и покажем, как самостоятельно проверить, куда «уходит» разница.

Два разных вопроса: сколько данных и сколько места занято

Когда операционная система показывает размер файла, она отвечает на вопрос «сколько байт полезных данных записано в этом файле». Когда показывает размер на диске — вопрос другой: «какой объём физического хранилища зарезервирован под этот файл». Это разные вещи, потому что диск не умеет выделять место побайтово.

Файловая система делит накопитель на блоки фиксированного размера — кластеры (их также называют единицами распределения). Даже если файл занимает один байт, под него будет выделен целый кластер. Отсюда классическая ситуация: тысяча мелких текстовых файлов по 100–500 байт может занять на диске несколько мегабайт, потому что каждому достался свой кластер целиком.

Как работает кластеризация

Типичный размер кластера на современных дисках — 4 КБ (4096 байт), хотя он зависит от файловой системы, объёма раздела и настроек форматирования. Логика выделения места такая:

  • файл размером до 4 КБ занимает один кластер — на диске он «весит» 4 КБ независимо от реального содержимого;
  • файл размером 5 КБ занимает два кластера — 8 КБ на диске;
  • файл размером ровно 4096 байт занимает один кластер без остатка — здесь цифры совпадут.

Поэтому для больших файлов (фильмы, архивы, образы) разница из-за кластеров почти незаметна — она не превышает одного кластера. А вот папки с десятками тысяч мелких файлов (кэш браузера, исходный код, фотографии небольшого разрешения) теряют заметно больше места, чем показывают суммарные размеры файлов.

Единицы измерения: килобайты, кибибайты и маркетинговые гигабайты

Вторая причина расхождений — путаница в системах счисления. Производители накопителей считают в десятичных единицах: 1 ГБ = 1 000 000 000 байт. Операционные системы традиционно используют двоичные: 1 ГиБ = 1 073 741 824 байта (1024³). Разница между ними — около 7% на каждом гигабайте.

Отсюда известный эффект: новый диск «на 1 ТБ» после форматирования показывает примерно 931 ГБ. Диск не обманывает и место не потеряно — просто числа пересчитаны в другую систему. Некоторые ОС постепенно переходят на корректные обозначения (КиБ, МиБ, ГиБ), но в быту все продолжают говорить «килобайты» и «гигабайты», подразумевая то одно, то другое.

Десятичная единица (производители) Двоичная единица (ОС) Разница
1 КБ = 1000 байт 1 КиБ = 1024 байта 2,4%
1 МБ = 10⁶ байт 1 МиБ = 1024² байт около 4,9%
1 ГБ = 10⁹ байт 1 ГиБ = 1024³ байт около 7,4%
1 ТБ = 10¹² байт 1 ТиБ = 1024⁴ байт около 10%

Практический вывод: если сравниваете размеры файлов и свободного места, смотрите, какую систему использует конкретная программа. Файловый менеджер и загрузчик могут показывать одну и ту же величину с разницей в несколько процентов только из-за округления.

Сжатие: когда файл на диске меньше, чем его данные

Место на диске может быть меньше логического размера файла, если данные хранятся в сжатом виде:

  • Прозрачное сжатие файловой системы. NTFS умеет сжимать файлы и целые папки «на лету»: пользователь видит исходный размер, а физически занято меньше. Работает хорошо на текстах, плохо — на уже сжатых данных вроде видео и архивов.
  • Архивы и контейнеры. ZIP-архив при открытии сообщает размер распакованного содержимого, а на диске занимает меньше. То же касается образов дисков и резервных копий.
  • Дедупликация. Серверные системы могут хранить одинаковые блоки данных один раз, а файлам выдавать ссылки. Логический объём данных превышает физический, иногда многократно.
  • Разрежённые файлы (sparse files). Если внутри файла есть длинные участки нулей, файловая система может их вообще не записывать на диск. Такой файл «весит», например, 10 ГБ, а физически занимает сотни мегабайт. Так работают образы виртуальных машин и некоторые базы данных.

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

Метаданные и служебная информация

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

  • В NTFS у каждого файла есть запись в таблице MFT; мелкие файлы могут целиком помещаться прямо в эту запись, но служебные структуры всё равно расходуют место.
  • Журналируемые файловые системы ведут журнал операций — это страховка от повреждения при сбое питания, но и дополнительный расход ёмкости.
  • У фотографий и видео метаданные (EXIF, GPS-координаты, настройки съёмки) могут занимать десятки килобайт — для тысячи снимков это уже мегабайты.

По отдельности вклад каждой позиции мал, но на накопителе с миллионами файлов суммарный «невидимый» объём становится ощутимым. Именно поэтому даже пустой только что отформатированный раздел показывает не ноль занятого места, а некоторый служебный минимум.

Размер в оперативной памяти: третья цифра, которая всех путает

Часто под «размером в памяти» имеют в виду объём, который процесс занимает в оперативной памяти, — например, в диспетчере задач. Здесь расхождения ещё больше, потому что память и диск устроены принципиально по-разному:

  • Выравнивание страниц. Память выделяется страницами (обычно по 4 КБ), и каждая область данных округляется вверх до границы страницы.
  • Загрузка секций. Программа на диске — это упакованный файл, а в памяти её код и данные размещаются с выравниванием и дополнительными структурами.
  • Совместно используемые библиотеки. Одна и та же системная библиотека физически находится в памяти один раз, но учитывается в адресном пространстве многих процессов. В зависимости от того, считает ли диспетчер «рабочий набор» или «выделенную память», цифры будут разными.
  • Сжатие и выгрузка. Часть памяти может быть сжата или отправлена в файл подкачки — тогда текущее значение меняется динамически.

Поэтому программа с установочным файлом на 200 МБ может занимать в памяти и 50 МБ, и 800 МБ — в зависимости от архитектуры, загруженных модулей и момента замера. Это нормально и не говорит ни о ошибке, ни о «прожорливости» программы саму по себе.

Как проверить, куда уходит разница

Большинство расхождений можно диагностировать самостоятельно, без специальных программ:

  1. Откройте свойства файла и сравните строки «Размер» и «Размер на диске». Если вторая больше и кратна 4 КБ — это обычная кластеризация, беспокоиться не о чем.
  2. Если «размер на диске» заметно меньше — проверьте, не сжат ли файл средствами файловой системы (атрибут сжатия) и не является ли он разрежённым или архивом.
  3. Для папки с множеством мелких файлов посмотрите её свойства: сумма размеров файлов будет меньше реально занятого места. Уменьшить потери можно, упаковать такие файлы в один архив или контейнер.
  4. Сравните суммарный объём всех файлов на разделе со свободным местом. Расхождение в несколько процентов — норма: это метаданные, журнал и служебные структуры. Большая необъяснимая разница может указывать на скрытые файлы (включите отображение системных файлов) или на проблемы с файловой системой.
  5. Проверьте размер кластера тома командой проверки файловой системы или утилитой информации о томе — это поможет точнее оценивать потери на мелких файлах.

Типичные ошибки и заблуждения

  • «Диск продали с недостающим объёмом». Нет: производитель честно указал десятичные гигабайты, система показывает двоичные. Пересчитайте — цифры сойдутся.
  • «Мелкие файлы ничего не весят». Каждый из них занимает минимум один кластер. Миллион файлов по 200 байт займёт несколько гигабайт.
  • «Скопировал файл — стало вдвое больше места». Нет: копия занимает столько же, сколько оригинал, плюс свои метаданные. Двойной расход возникает только при одновременном хранении сжатой и несжатой версий.
  • «Удалил файлы, а место не освободилось». Возможные причины: файлы попали в корзину, программа держит удалённые файлы открытыми, часть места занята теневыми копиями, точками восстановления или журналом. Проверьте корзину и настройки резервного копирования.
  • «Размер в диспетчере задач должен совпадать с размером файла программы». Это разные величины: файл на диске и образ процесса в памяти связаны, но не равны.

Что важно помнить на практике

Главный ориентир: расхождение между размером файла и занятым местом — это не дефект, а следствие устройства хранилища. На решение влияют три фактора: размер кластера (важен для множества мелких файлов), сжатие и разрежённое хранение (меняют соотношение в любую сторону) и система счисления (даёт стабильную разницу около 7% на гигабайте).

Если вы выбираете накопитель, закладывайте запас: реальный доступный объём всегда меньше заявленного, а служебные структуры и особенности файловой системы съедают ещё немного. Если планируете хранить много мелких файлов — заранее оцените потери на кластерах или используйте архивы и контейнеры. Если цифры в конкретной программе кажутся странными — сравните их со свойствами файла и показателями другого файлового менеджера: так вы быстро поймёте, где именно возникает разница.

PEFile.ru