Есть ли инструмент, который показал бы мне для конкретного файла на диске, насколько он фрагментирован? (Сколько операций поиска нужно выполнить на физическом диске, если я буду читать этот файл линейным способом)
Как увидеть фрагментацию конкретного файла?
Ответы (5)
Вы можете использовать DeviceIoControl
с FSCTL_GET_VOLUME_BITMAP
, FSCTL_GET_RETRIEVAL_POINTERS
и FSCTL_MOVE_FILE
, см. Дефрагментация файлов.
Вы также можете найти другие примеры кода, если будете искать FSCTL_MOVE_FILE
.
Вот один из них в C и еще один в .NET.
Инструмент Sysinternals contig с параметром -a
может сделать это для файла или всех файлов в папке и ее подпапках.
filefrag — это инструмент, который вам нужен, если вы используете Linux. Используйте параметр -v с именем файла, чтобы получить подробный список фрагментации. http://linux.die.net/man/8/filefrag
И, конечно, "фрагментация" вызывает подозрение:
- Файл может быть кусками в одном и том же цилиндре. Никаких накладных расходов на поиск, только задержка вращения. Или нет, так как фигуры могут быть в оптимальном порядке (в этом случае шансы близки к нулю).
- Файл может быть «непрерывным», но на нескольких цилиндрах. Даже последовательное чтение приведет к поиску.
- Файл может находиться в чередующемся наборе, и вы понятия не имеете, где проходят границы. Вы можете перейти к другому контроллеру, другому шпинделю или другому разделу на том же диске.
Будьте осторожны с выводами, которые вы делаете.
fsutil file queryallocranges offset=<o> length=<l> <file>
покажет вам размеры файла, вам потребуются права администратора.