Хорошо, давайте ответим по пунктам...
Вопрос 1: Когда я создаю файл в NTFS, сохраняется ли он непрерывно на физическом жестком диске?
Вопрос не имеет смысла. Когда вы создаете файл, NTFS выделяет место в MFT для метаданных, необходимых для отслеживания вещей. Небольшие файлы могут фактически поместиться в записи MFT для файла - такие резидентные файлы по определению являются непрерывными. Если файл не помещается в MFT, то блоки пространства выделяются по мере необходимости, и они могут быть или не быть смежными. Вообще говоря, она не знает, какого размера будет ваш файл или сколько места для него предварительно выделить, поэтому NTFS просто выделит место по мере необходимости, хотя вы можете дать ей подсказку, вызвав SetEndOfFile
. Но это дает только подсказку и не гарантирует, что данные файла будут храниться в непрерывной области диска. На самом деле несложно убедить себя в том, что даже если файловая система выполняет дефрагментацию в реальном времени, она никогда не может *гарантировать, что свободное пространство будет доступно в виде единого непрерывного блока дисковых адресов.
Вопрос 2: если нет, есть ли способ создать файл таким образом, чтобы при записи в него данные сохранялись в нем непрерывно (на жестком диске)? Что-то вроде экстентов в базе данных.
Почему вы считаете, что это важная проблема? Как правило, вам все равно, как файловая система хранит ваши данные; вы должны заботиться только о том, что он хранит данные. Вы можете подумать, что доступ к файлу, который не хранится постоянно, будет медленнее, но это не всегда так; усовершенствованные алгоритмы кэширования и предварительная выборка операционной системой часто полностью устраняют любое замедление. Если вас беспокоит производительность, то есть ли у вас фактические жесткие данные, которые показывают, что фрагментация файловой системы является проблемой? Если это так, правильный подход состоит в том, чтобы либо использовать другую файловую систему, либо вообще не использовать файловую систему.
Вопрос 3: если такой файл существует - есть ли способ прочитать данные из него (используя системный вызов C read) в группе/блоке. какой максимальный размер группы я могу использовать.
Системные вызовы C (такие как fread
) не знают о NTFS, фрагментации, "связках" и блоках. Все, что они знают, это как прочитать запрошенное количество байтов из указанного дескриптора файла и поместить данные в предоставленный вами буфер. На самом деле вы можете указать любой размер, который вы хотите, хотя библиотека C будет вызывать API-интерфейсы операционной системы и файловой системы для чтения данных, кратных размеру блока, который определяется реализацией.
person
Nik Bougalis
schedule
01.04.2013