Вопрос Почему существует такая большая разница между «Размер» и «Размер на диске»?


Как вы можете видеть ниже, разница между Размер а также Размер на диске поля в моей папке. Почему это?

Screenshot showing 50,875 files in 1,504 folders, 105 MB being 1.43 GB on disk

я знаю это Размер на диске должно быть немного больше, чем Размер из-за единиц размещения в Windows, но почему эта разница? Может быть, из-за большого количества файлов?

BTW, эта папка находится на моей SD-карте телефона Android. Внутри этого приложения карт хранит свои кэшированные карты, и приложение получает свою карту с Карт Google.


295
2018-01-20 09:48


происхождения


Привет, thelastblack, и добро пожаловать в SuperUser. Я отредактировал ваш вопрос, чтобы удалить часть об дефрагментации, поскольку в двух существующих ответах основное внимание уделяется размеру / размеру дискового дискового пространства, а формат Stack Exchange работает лучше всего, когда каждый размещенный вопрос - это одна вещь. Конечно, вы можете повторно спросить об этом как о отдельном вопросе, хотя я думаю, что ответы, которые вы получили до сих пор по этому вопросу, показывают, что дефрагментация вам не поможет. (Это также, как правило, не имеет ничего хорошего на твердых носителях.) Не стесняйтесь редактировать ваш вопрос дальше, если вы чувствуете, что я изменил ваше намерение в любом случае. - Michael Kjörling
@ MichaelKjörling Heh, я только что редактировал небольшую дискуссию о фрагментации (немного отвлекся) - Bob
@ MichaelKjörling не редактируйте вопросы ретроактивно, чтобы соответствовать ответам. Один из ответов касается фрагментационной части вопроса ОП. Ваше изменение нужно отбросить, чтобы избежать путаницы. - DanteTheEgregore
@DanteTheEgregore Если вы ссылаетесь на ответ Боба, который действительно был отредактирован, чтобы также обсудить эффекты фрагментации, то перед тем, как прыгать с пистолета, пожалуйста, проверьте историю изменений и отметки времени на этот ответ и вопрос. Во время моего редактирования ответ Боба вообще не затрагивал проблему фрагментации. Если OP захочет сделать это, редактирование обратно в «будет ли дефрагментация средств массовой информации помочь мне с этим?» должен разрешить любую выдающуюся путаницу, хотя я все еще чувствую что лучше задавать как отдельный вопрос; ИМО вопрос разницы между этими двумя значениями не связан. - Michael Kjörling
Похоже на то, что это приложение серьезно запрограммировано - рассмотрите вопрос об отправке отчета об ошибке. Я ни в коем случае не профессиональный программист, но когда-то я взломал что-то подобное в JavaME, и, конечно, одной из проблем, которые мне пришлось решить, было то, как эффективно хранить все эти мелкие карты (хранение и доступ) в контейнере. Я закончил использование несжатых ZIP-файлов. - A. Donda


ответы:


Я буду предполагать, что вы используете файловую систему FAT / FAT32 здесь, поскольку вы упоминаете, что это SD-карта. NTFS и exFAT ведут себя аналогично в отношении единиц распределения. Другие файловые системы могут быть разными, но в любом случае они не поддерживаются в Windows.

Если у вас много мелких файлов, это, безусловно, возможно. Учти это:

  • 50 000 файлов.

  • Размер кластера 32 кБ (единицы распределения), который является максимальным для FAT32

Хорошо, теперь минимальный занимаемое пространство составляет 50 000 * 32 000 = 1,6 ГБ (с использованием префиксов СИ, а не двоичных, чтобы упростить математику). Пространство, которое каждый файл занимает на диске, всегда кратно размеру единицы размещения - и здесь мы предполагаем, что каждый файл на самом деле достаточно мал, чтобы вписаться в единую единицу, с некоторым оставшимся пробелом.

Если каждый файл составлял в среднем 2 КБ, вы получили бы около 100 МБ общего объема, но вы также тратите 15х (30 кбайт на файл) в среднем из-за размера единицы размещения.


Углубленное объяснение

Почему это происходит? Ну, файловая система FAT32 должна отслеживать, где хранится каждый файл. Если бы он содержал список каждого байта, таблица (например, адресная книга) будет расти с той же скоростью, что и данные, и тратить много места. Поэтому они используют «единицы распределения», также известные как «размер кластера». Том разделен на эти единицы распределения, и, что касается файловой системы, они не могут быть разделены - это самые маленькие блоки, которые он может адресовать. Так же, как у вас есть номер дома, но ваш почтальон не заботится о том, сколько у вас комнат или кто живет в них.

Итак, что произойдет, если у вас очень маленький файл? Ну, файловой системе все равно, будет ли файл 0 kB, 2 kB или даже 15 kB, он даст ему наименьшее пространство, которое он может - в приведенном выше примере - 32 kB. В вашем файле используется только небольшое количество этого места, а остальное в основном тратится впустую, но все равно принадлежит файлу - как и спальня, которую вы оставляете незанятой.

Почему существуют разные размеры единиц размещения? Ну, это становится компромиссом между большим столом (адресной книгой, например, говоря, что Джон владеет домом на 123 Fake Street, 124 Fake Street, 666 Satan Lane и т. Д.) Или больше потерял пространство в каждой части (доме). Если у вас большие файлы, имеет смысл использовать более крупные единицы размещения - потому что файл не получает новую единицу (дом), пока все остальные не будут заполнены. Если у вас много маленьких файлов, то у вас будет большая таблица (адресная книга), так что вы можете также дать им небольшие единицы (дома).

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


Дробление?

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


Возможные решения

В виде гладиатор2345 предложил, ваши единственные реальные варианты на этом этапе - жить с ним или переформатировать с меньшими единицами выделения.

Ваша карта может быть отформатирована в FAT16, которая имеет меньший предел размера таблицы и, следовательно, требует гораздо больших блоков распределения, чтобы обращаться к большему объему (с верхним пределом в 2 ГБ с 32-килобайтными единицами распределения). Источник любезно предоставлено Braiam, Если это так, вы должны быть в состоянии безопасно форматировать как FAT32 в любом случае.


299
2018-01-20 09:54



Израсходованное пространство из-за минимальных размеров размещения фактически технически называется «внутренней фрагментацией», поэтому вы мог говорят, что фрагментация является виновником. Но это еще не то, что любой инструмент «дефрагментации» может что-то сделать. - hobbs
(Менее технически это просто называется «слабым».) - hobbs
Размеры кластера также ограничивают максимальный размер файловой системы. Например, если ваше адресное пространство 32-битное, у вас есть всего 4,29 миллиарда возможных полных кластеров. Теперь, если вы используете наименьший размер кластера, поддерживаемый NTFS (512 байт), вы можете указать максимум 512 * 2 ^ 32 байта = 2 гигабайта. Если вам нужен том, который может хранить более 2 гигабайт данных, вам необходимо увеличить размер кластера. Все это независимо от фактического самого большого файла, который вы пытаетесь сохранить, при условии, что вы не можете хранить файл размером более 2 гигабайт, что является наименьшей из ваших проблем. - Andon M. Coleman
4 кластера KiB позволят вам обращаться к файлам объемом тома до 16 TiB, чего должно быть достаточно в обозримом будущем. - Andon M. Coleman
Ну, он мог бы сжать свой архив небольших файлов в один большой файл. - einpoklum


Это одна из тех ситуаций, когда сжатие / архивирование в один файл может помочь. Какие Боб сказал, что в его ответе верно но решение может быть проще, чем переформатировать диск, как предлагают другие ответы. Если вы сжимаете или архивируете каталог (используя zip, tar или любой другой метод), файловая система увидит, что у вас есть один большой файл, а не несколько более мелких. Даже без сжатия вы получите почти 1,4 гигабайта пространства, потому что все эти «маленькие файлы» будут считаться одним большим файлом.

Внутри этого приложения карт хранится его кэшированные карты, и приложение получает свою карту с Google Maps

Возможно, вам стоит обсудить с разработчиком использование архива или базы данных вместо нескольких файлов. Это, вероятно, также поможет сделать диск менее фрагментированным и, безусловно, сэкономит место, особенно если это флэш-накопитель NAND. Если вы объясните смешную ситуацию, когда 100 МБ полезной информации / полезных данных становится 1,4 ГБ, что-то не так, как хранятся данные, и разработчики должны принести более приятное решение.


46
2018-01-20 15:03



> Внутри этого приложения карт хранит свои кэшированные карты, и приложение получает свою карту с Карт Google. - к сожалению, в этом случае сжатие (которое фактически является файловой системой над базовым) потребует поддержки от этого приложения сопоставления. - Bob
@Bob, тогда решение должно исходить от разработчика D: - Braiam
Это абсолютно верно. Я думаю, что пока я должен изменить свое приложение. - vfsoraki
@Braiam Это не обманывает файловую систему, думая, что есть только один файл; там является только один файл. Что касается того, почему разработчики не хранят информацию о кеше в архиве, это, вероятно, потому, что большинство архивных форматов не предназначены для быстрой случайной записи, которой, безусловно, нужен кеш. Лучшей альтернативой может быть использование легкой библиотеки баз данных, такой как SQLite. - bcrist
Абсолютно верно ..... +1 - arundevma


В случае, если кто-либо сталкивается с этой проблемой, было бы полезно также знать, что еще одна причина увидеть большую разницу в размере файла на диске - это использование альтернативные потоки данных (ОБЪЯВЛЕНИЯ)

Это относится только к NTFS, насколько мне известно. ADS известны как законным, так и не законным использованием:

  • пометить файл как загруженный из Интернета
  • для хранения метаданных (Microsoft хотела включить некоторые функции Apple OS, например, не использовать расширение файла для определения типа файла)
  • скрыть данные или код в контексте вредоносного ПО,

ADS просто: любой файл NTFS может содержать несколько потоков данных (понимать «подфайлы»). Один из них - основной поток, используемый проводником Windows и другими инструментами Windows, он содержит обычный контент файла. Альтернативные потоки данных могут содержать другую информацию точно так же, как основной поток, но они не могут обрабатываться непосредственно средствами Windows (в частности, Explorer отображает размер файла равным размеру основного потока, независимо от размера ADS) вы должны использовать специализированные инструменты или код для написания, чтения и поиска ADS.

Главное, что в случае большой разницы в размерах файлов, не забывайте о возможности ADS и скрытых вредоносных программ.

Еще одна ссылка,

Чтобы безопасно экспериментировать с ADS, попробуйте это на уровне DOS / CMD ...

Создайте и затем отобразите содержимое файла в корневом каталоге C:

C:\> echo The main data stream> test.txt
C:\> type test.txt

Результат:

C:\> The main data stream

Теперь добавьте ADS с тем же методом, просто укажите имя ADS в дополнение к имени файла:

C:\> echo The secret message> test.txt:secret

Вы только что скрыли секретное сообщение в файле. Обратите внимание, что размер файла в проводнике не изменился, несмотря на то, что мы добавили байты в «секретный» ADS.

Попробуйте отобразить содержимое ADS:

C:\> type test.txt:secret

Результат:

The filename, directory name, or volume label syntax is incorrect.

CMD type не может отображать содержимое ADS. Вместо этого мы будем использовать Notepad:

notepad test.txt:secret

В «Блокноте» мы видим содержание ADS:

The secret message

Вы также можете скрыть полный исполняемый файл в ADS невинного текстового файла и запустить его в любое время. Богатство не вредит хакерам :-)


25
2018-01-21 07:37



Я сам не победитель, моя работа в основном выполняется в Linux. Это было очень полезно. спасибо - vfsoraki
Стоит использовать такой инструмент, как Streams from Sysinternals для проверки использования ADS. Например, файлы, загруженные в систему Windows, могут быть помечены источником в ADS, хотя это крошечный и не должно занимать место. Он обычно не отображается в каталоге dir или Explorer. Это может занять блоки и усугубить проблему использования диска, которую вы изучаете. , - adric


Проблема может быть из-за размера кластера.

В соответствии с Microsoft:

Если вы не используете сжатие NTFS для любых файлов или папок   содержащийся на томе, разница между SIZE и SIZE ON DISK   является потраченным впустую пространством из-за большего размера кластера. Вы   следует попытаться использовать оптимальный размер кластера, чтобы SIZE ON DISK   значение как можно ближе к значению SIZE. Чрезмерное   несоответствие между SIZE ON DISK и значением SIZE является   что размер кластера по умолчанию слишком велик для среднего   размер файла, который вы храните на томе, и что он должен быть   уменьшилось. Это можно сделать только путем резервного копирования объема, а затем   переформатирование громкости с помощью команды format и переключателя / a   для указания соответствующего размера размещения: IE: format D: /a:2048   (В этом примере используется размер кластера размером 2 КБ).

Попробуйте форматировать свой диск с меньшим размером кластера.


19
2018-01-20 09:57



Было сказано, что размер кластера не должен составлять 4096 байт или просто не кратен этому числу. 32-разрядная ОС работает со страницами, которые (в случае без PAE) имеют 4096 байт, поэтому использование не множественных кластеров может отрицательно повлиять на производительность файловой системы. Поэтому размер по умолчанию установлен в 4096 байт. - Ruslan
Чтобы добавить к тому, что сказал @Ruslan, новые жесткие диски теперь имеют размер сектора 4 кБ, и было бы оптимально согласовать файловую систему с физическими секторами и иметь размер физического сектора как размер блока распределения. - Bob
@Ruslan Я считаю, вы хотите сказать, что это должна быть сила два раза 4096. 12288 (3 × 4096) и 20480 (5 × 4096) не являются большим выбором. - Scott


Я вижу, что многие рекомендуют переформатировать ваш диск с меньшим размером кластера. Так как это SD-карта, обратите внимание, что многие поставщики предварительно форматируют карту до рекомендуемого размера кластера, чтобы соответствовать размеру кластера NAND (сохранение обоих в синхронизации очень важно для оптимальной производительности чтения / записи и уменьшения износа)

Вы не можете изменить размер кластера NAND (это физический атрибут аппаратного обеспечения вашей SD-карты).

Сначала запустите scandisk / chkdsk на SD-карте, чтобы убедиться, что проблема с размером отчета не лежит в поврежденной файловой системе.

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


9
2018-01-21 18:20



На самом деле это были не Карты Google, а другое приложение, использующее карты Google. Я сообщил разработчику и просто удалил эти файлы с моего SD. - vfsoraki


Это общая проблема со многими файловыми системами. Здесь действуют два фактора: максимальное количество «блоков» файловой системы может обрабатывать каждый логический том и физические ограничения носителя данных. Только один файл может быть выделен для любого данного блока (файлы обычно занимают столько блоков, сколько им нужно). Таким образом, текстовый файл с 64 байтами может принимать от 4k до 32k что угодно, в зависимости от размера блока файловой системы, на которой он находится.

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

Одно из правил размещения вещей в коробках состоит в том, что вы не можете поместить две несвязанные вещи в коробку. Они должны быть частью того же документа. Поэтому, если бы я напечатал страницу с текстом, у нее была бы собственная коробка. Если бы у моего напечатанного текста было столько страниц, что я не мог бы вместить все это в одну коробку, я бы просто нашел еще одну коробку и продолжал помещать туда страницы, повторяя, пока не заполнил все мои страницы. Я также записал ящики, которые я использовал для этого документа, и порядок ящиков, чтобы прочитать его в последовательности.

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

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

Одни и те же ситуации возникают среди различных решений для хранения данных. FAT32 может управлять только тем, что считается небольшим количеством «ящиков» на сегодняшних огромных жестких дисках, поэтому оно заканчивается очень большими «ящиками», чтобы компенсировать это.


7
2018-01-20 14:50





Помимо размеров кластеров, вы также можете иметь несоответствие из-за следующих условий:

  • Сжатые или зашифрованные файлы могут использовать другое пространство, чем размер логического файла.
  • Связанные файлы будут сообщать N умноженное на количество ссылок за раз размер файла для размера логического файла, но используемое физическое пространство обычно меньше.

6
2018-01-20 17:42



Как правило, это может быть правдой. Но в моем случае проблема была связана с высокой единицей распределения. - vfsoraki
Я просто пытаюсь добавить к ответу, указав более возможные причины несоответствия. - Archimedes Trajano


Вы должны взглянуть на запись блокировки блока в Википедии. Это именно то, что с тобой происходит. Использование файловой системы с поддержкой Tail Packaging является решением уровня файловой системы для этой проблемы, кроме изменения размера кластера кластеров.

У всех есть неудобства для переформатирования диска.

В некоторых случаях простое сохранение этих файлов в архиве устранит проблему (и небольшие файлы также будут сжаты рядом с остановкой потери места в конце файлов). Это неудобно потратить некоторое время на декомпрессию.

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

http://en.wikipedia.org/wiki/Tail_packing


6
2018-01-20 15:00





Я отметил огромные несоответствия размера файла в Windows 10 в отдельном файле, но если я посмотрю на свойства файла SAME из того же места (сетевого диска), с Windows XP, большого несоответствия нет; просто небольшая разница, что и следовало ожидать. Я думаю, что в Windows 10 есть ошибка. Файл размером 449 Мбайт, вероятно, не занимает 3,99 ГБ, что мне говорит Windows 10.


0
2018-06-15 17:57



Просто FYI, вопрос не имеет ничего общего с Windows 10. OP использует Windows 7. - TheKB