Каковы ограничения на размер и количество выделенных диапазонов в разреженном файле?

Я работаю над частью программного обеспечения, которое записывает данные в разреженные файлы NTFS, и я не могу найти никакой документации о том, каковы пределы разреженного файла NTFS.

Я видел ссылку на тот факт, что ограничения существуют, но не на то, что это за ограничения.

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


person ChrisPatrick    schedule 23.11.2016    source источник
comment
2^44 байта — 64 КБ. Вы могли использовать Google, знаете ли...   -  person specializt    schedule 23.11.2016
comment
@specializt Это вполне может быть верно для нормального файла, но я понимаю, что разреженный файл отличается, потому что он опирается на отдельную таблицу диапазонов распределения, которая имеет свои собственные ограничения. .   -  person ChrisPatrick    schedule 23.11.2016
comment
.... нет. Я думаю, вы могли неправильно понять несколько концепций - разреженные файлы ничем не отличаются, они просто могут не содержать никаких фактических данных, вы можете размещать до ограничения размера файла NTFS, нет отдельных таблиц диапазона размещения , это было бы ужасно с точки зрения производительности   -  person specializt    schedule 23.11.2016
comment
Как показано здесь , разреженный файл содержит ряд выделенных диапазонов. Если вы запросите данные за пределами любого из этих диапазонов, ОС просто вернет нули. Эти выделенные диапазоны отслеживаются отдельно. И из последнего абзаца: большие и сильно фрагментированные разреженные файлы могут превысить ограничение NTFS на дисковые экстенты до того, как будет использовано доступное пространство. Эта статья также подразумевает то же самое в разделе «Могут ли они быть такими на самом деле». Большой?   -  person ChrisPatrick    schedule 23.11.2016
comment
Возможно, я плохо сформулировал свой вопрос, но остальная часть этого предложения: Вы можете создать максимально возможный разреженный файл объемом 16 терабайт тогда и только тогда, когда он состоит из одной разреженной нулевой области, без данных вообще. Это означает, что если я пишу разреженный файл с фактическими данными в нем, будет точка (до того, как я достигну 16 ТБ), в которой я больше не смогу записывать данные в этот файл. На мой взгляд, это ограничение размера разреженного файла, который я могу иметь, а также то, о чем я не могу найти документации.   -  person ChrisPatrick    schedule 23.11.2016
comment
этот самый предел упоминается в моем самом первом комментарии.   -  person specializt    schedule 23.11.2016
comment
2^44 байта = 16 ТБ. По-видимому, это возможно только в разреженном файле, если в файле нет данных.   -  person ChrisPatrick    schedule 23.11.2016
comment
Вы могли бы хотеть прочитать мой первый комментарий снова. И снова. Возможно, даже нажмите на ссылку   -  person specializt    schedule 23.11.2016
comment
Хорошо, может быть, я туплю. В вашем комментарии (и да, я прочитал статью по ссылке) говорится, что максимальный размер файла в NTFS составляет 2 ^ 44 байта - 64 КБ. Отлично. Однако во второй статье, на которую я ссылаюсь, говорится, что на практике, вероятно, можно с уверенностью предположить, что вы всегда можете создать разреженный файл размером 300-500 гигабайт, но любая попытка создать файл большего размера может привести к ошибке «Диск заполнен», независимо от того, как написано мало реальных данных. Это означает, что независимо от реализации (о которой MS вряд ли будет говорить), у разреженных файлов есть некоторый дополнительный предел.   -  person ChrisPatrick    schedule 23.11.2016
comment
эта маленькая статья - просто какая-то .... статья на каком-то случайном частном веб-сайте. Просто какой-то парень что-то выдумывает. Абсолютно никогда не доверяйте никаким неофициальным заявлениям. Дополнительных ограничений нет, но обстоятельства среды вполне могут помешать вам создать эти огромные файлы — ядро ​​Windows — очень сложный и динамичный зверь, оно может переназначить ресурсы в любое время, поэтому, если ваша система находится под load вы можете столкнуться с временными ограничениями, но вы не столкнетесь с ними, если будете программировать разумным образом. Всегда. Это так просто. Используйте защитное программирование   -  person specializt    schedule 23.11.2016
comment
Я именно поэтому и задал вопрос.   -  person ChrisPatrick    schedule 23.11.2016
comment
хорошо, я рад, что смог помочь.   -  person specializt    schedule 23.11.2016


Ответы (2)


В документации по коду ошибки вы найдете некоторые подсказки относительно пределы:

Конкретно:

Если вы планируете использовать очень большие файлы (более 500 ГБ), которые содержат много фрагментов на месте, вам следует отформатировать том с помощью параметра "/L", чтобы разместить записи файлов большого размера. По умолчанию том отформатирован для использования файловых записей небольшого размера.

документация по параметру "/L" имеет приблизительное максимальное количество экстентов на файл NTFS:

Включает поддержку больших сегментов файловых записей (FRS). Это необходимо для увеличения количества экстентов, разрешенных для каждого файла на томе. Для больших записей FRS ограничение увеличивается примерно с 1,5 миллиона экстентов до примерно 6 миллионов экстентов.

person UrOni    schedule 07.12.2016

Ответ будет зависеть от того, насколько разреженным является файл, а также от размера кластера жесткого диска.

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

Итак, предположим, что у вас есть диск объемом 1 ТБ, который по умолчанию имеет размер кластера 4 КБ, и вы записываете файл размером 512 ГБ.

  • Если вы записываете этот файл последовательно, система попытается выделить смежные блоки, и в списке будет относительно небольшое количество записей (фрагментов в файле).
  • Если вы запишете этот файл случайным образом, вы создадите разреженный файл; каждый раз, когда вы записываете блок, который не был записан ранее, вы должны выделять кластер для этого блока. Поскольку вы пишете случайным образом, ОС, вероятно, не сможет выделить смежные кластеры, поэтому в списке будет больше записей. Для вашего файла размером 512 ГБ может потребоваться 134 217 728 фрагментов (при условии, что я правильно рассчитал).

Я не знаю, будет ли такое количество фрагментов выше возможностей структур управления NTFS. Но давайте предположим, что это так. Вы по-прежнему можете управлять этим файлом, если используете том с размером кластера 64 КБ (в результате получается 8 388 608 фрагментов).

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

Ссылки (оба от Microsoft):

  • Как работает NTFS – обзор структур файловой системы NTFS.
  • Четыре этапа о росте файлов NTFS — сообщение члена группы поддержки Microsoft, в котором подробно рассказывается, как со временем увеличиваются узлы размещения для файла. См. также последующую публикацию, в которой показан частичный обходной путь, увеличивающий количество записей о распределении.
person kdgregory    schedule 25.11.2016