Какой алгоритм распределения блоков использует NTFS?

10

В Windows XP 64 я скачал файл размером 1,2 ГБ, и он оказался фрагментированным, как показано на рисунке. К сожалению, перед тем, как сделать снимок из Piriform Defraggler, я дефрагментировал другие файлы, поэтому вы не можете увидеть точное состояние в тот момент, когда файл был записан. Однако диск все время был почти таким же пустым, как сейчас (используется 25%) и почти не фрагментирован.

скриншот 1

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

ОБНОВИТЬ:

Это то, что произошло сегодня после записи 67 МБ нового файла. Он был разбит на 731 фрагмент, средний размер всего 95 КиБ. Файл использовался, чтобы заполнить некоторые пробелы, но не все, он также не использует огромное непрерывное свободное пространство. Странно, не правда ли?

скриншот 2

ОБНОВЛЕНИЕ 2:

В отличие от PC Guru , я действительно не думаю, что Opera является виновником. Я думаю, что (в отличие от Google Chrome) не сообщает Windows ожидаемый размер, однако, есть много случаев, когда это невозможно, и ответственность за то, чтобы справиться с этим, лежит на операционной системе. На следующем рисунке показано, что произошло после нескольких дней, когда я почти ничего не делал с этим разделом - каталог TEMP и все мои данные (за исключением данных, управляемых Windows) находятся в другом месте. Сама Windows, похоже, не использует SetEndOfFileи ужасно фрагментирует свои собственные файлы (600 фрагментов на пару небольших файлов размером около 40 МБ). NTFS, похоже, не использует первый доступный сектор, так как снова есть файлы в середине, а также в конце довольно пустого диска (использование 23%),

скриншот 3

maaartinus
источник

Ответы:

12

IIRC, файловая система NTFS пытается разместить файл в непрерывном хранилище. Однако это может быть сделано только в том случае, если файловая система знает размер файла. Если вы откроете файл и начнете писать в него, он запишется в «лучшее» место для размещения файла (обычно к внешней стороне диска). Но это «лучшее» место может быть недостаточно большим, чтобы вместить файл.

Если приложение сообщает NTFS фактический размер файла (с помощью SetEndOfFile ()), NTFS может лучше находить непрерывное пространство для файла (API SetEndOfFile заставляет NTFS выделять хранилище для всего файла).

Восстановить Моника Ларри Остерман
источник
Но, похоже, NTFS заполнила все пробелы и равномерно распределила все остальное по всему диску. Как я уже сказал, диск никогда не был намного полнее, чем сейчас, ваши части файла были записаны в некоторые из последних секторов (т. Е. В худшие места). Другие части были зажаты в небольших областях между двумя занятыми секторами, хотя в других местах было много свободного места.
Maaartinus
Вы вызывали setEndOfFile перед записью файла на диск? если вы этого не сделали, NTFS не сможет узнать фактический размер файла, поэтому он будет увеличивать файл, используя доступное хранилище.
Восстановить Монику Ларри Остермана
Это был не я, это была Опера. Скорее всего нет. Тем не менее, это не повод делать что-то странное.
Maaartinus
Что вы имеете в виду "это странно"? Если NTFS знает размер файла, который вы пишете, он будет делать умные вещи с файлом. Если он не знает размер файла, он не может сделать такую ​​же хорошую работу по распределению памяти.
Восстановить Монику Ларри Остермана
@ Ларри Остерман: Конечно, не зная размера файла, трудно сделать это правильно. Но делать это так плохо тоже сложно.
Maaartinus
2

Ваша проблема должна быть с Opera. Я только что посмотрел на кучу файлов на очень полном и фрагментированном диске. Большие файлы, загруженные с помощью Chrome, были смежными.

Это говорит о том, что Chrome знал размер файла в начале загрузки, поэтому сообщил NTFS о размере ожидаемого файла. Если вы сделаете это, NTFS попытается поместить файл в один фрагмент или, если ни один фрагмент не является достаточно большим, в самые большие доступные фрагменты. Интересно, что он всегда использует эти фрагменты в порядке убывания размера, поэтому большие файлы, скопированные Explorer на фрагментированный диск, могут перемещаться по всему диску.

Если программа не знает размер файла или не сообщает NTFS, но вместо этого просто открывает файл и начинает записывать последовательные данные, создается впечатление, что NTFS действует очень похоже на FAT32, который просто запускается в первом доступном кластере (или первый, доступный после последнего, выделенного в этом сеансе, затем использует все, что доступно оттуда, вперед. Как пример, примерно в то же время я попросил CCleaner сканировать реестр, заставляя его сохранять его в большой текстовый файл ".Reg". Этот файл начинался с начала диска, а затем был разбросан по 127 различным фрагментам. В отличие от файлов, скопированных с помощью Explorer или загруженных с помощью Chrome, в каждом файле, который я просматривал, кластеры располагались в порядке возрастания.

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

ПК Гуру
источник
Я прокомментировал ваш ответ в моем вопросе, так как мой комментарий стал длинным, и я добавил изображение.
Maaartinus