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

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

Снимок экрана с изображением 50,875 файлов в 1504 папках, 105 МБ - 1,43 ГБ на диске

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

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

295 голосов | спросил vfsoraki 20 Jpm1000000pmMon, 20 Jan 2014 13:48:05 +040014 2014, 13:48:05

9 ответов


298

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

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

  • 50 000 файлов.

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

Итак, теперь занимаемое пространство minimum составляет 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.

ответил Bob 20 Jpm1000000pmMon, 20 Jan 2014 13:54:32 +040014 2014, 13:54:32
46

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

  

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

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

ответил Braiam 20 Jpm1000000pmMon, 20 Jan 2014 19:03:08 +040014 2014, 19:03:08
25

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

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

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

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

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

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

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

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

C: \ > echo Основной поток данных> test.txt
C: \ > Тип test.txt

Результат:

C: \ > Основной поток данных

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

C: \ > echo Тайное сообщение> test.txt: тайна

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

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

C: \ > Тип test.txt: секрет

Результат:

Неверное имя файла, имени каталога или тома.

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

notepad test.txt: секрет

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

Секретное сообщение

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

ответил mins 21 Jam1000000amTue, 21 Jan 2014 11:37:00 +040014 2014, 11:37:00
19

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

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

  

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

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

ответил arundevma 20 Jpm1000000pmMon, 20 Jan 2014 13:57:49 +040014 2014, 13:57:49
9

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

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

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

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

ответил Matias N Goldberg 21 Jpm1000000pmTue, 21 Jan 2014 22:20:47 +040014 2014, 22:20:47
7

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

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

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

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

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

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

ответил CyberSkull 20 Jpm1000000pmMon, 20 Jan 2014 18:50:40 +040014 2014, 18:50:40
6

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

  • Сжатые или зашифрованные файлы могут использовать другое пространство, чем размер логического файла.
  • Связанные файлы будут сообщать n количество ссылок за раз размером файла для размера логического файла, но используемое физическое пространство обычно меньше.
ответил Archimedes Trajano 20 Jpm1000000pmMon, 20 Jan 2014 21:42:02 +040014 2014, 21:42:02
6

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

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

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

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

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

ответил kriss 20 Jpm1000000pmMon, 20 Jan 2014 19:00:39 +040014 2014, 19:00:39
0

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

ответил David Hutchins 15 J0000006Europe/Moscow 2016, 20:57:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132