Производительность NTFS и большие объемы файлов и каталогов

Как Windows с NTFS работает с большими объемами файлов и каталогов?

Есть ли какие-либо рекомендации относительно ограничений для файлов или каталогов, которые вы можете поместить в один каталог, прежде чем вы столкнетесь с проблемами производительности или другими проблемами?

Например. нормально ли иметь папку со 100 000 папок внутри?

Ответы на соответствующий вопрос уступают принятому здесь ответу.

Eric J. 30.10.2014 01:05

Эта реализация может быть полезна: github.com/acrobit/AcroFS

Ghominejad 22.12.2017 16:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
189
4
130 159
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

100000 должно быть хорошо.

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

Если вам интересно, техническое (и я надеюсь, теоретический) максимальное количество файлов составляет: 4 294 967 295

Для непосвященных это большое количество (2 ^ 32 - 1) файлов.

meatspace 08.01.2015 19:48

Для локального доступа большое количество каталогов / файлов не является проблемой. Однако, если вы обращаетесь к нему по сети, заметное снижение производительности наблюдается после нескольких сотен (особенно при доступе с компьютеров Vista (от XP до Windows Server с NTFS, похоже, в этом отношении работало намного быстрее)).

Вы уверены, что это NTFS (дисковый протокол на сервере), а не SMB (сетевой уровень)?

MSalters 13.10.2008 19:06

Нет, я не проводил дальнейших исследований, чтобы сузить причину. Единственная информация, которая у меня есть, подробно описана выше.

Brian Knoblauch 10.09.2012 20:29

Когда вы создаете папку с N записями, вы создаете список из N элементов на уровне файловой системы. Этот список представляет собой общесистемную общую структуру данных. Если вы затем начнете постоянно изменять этот список, добавляя / удаляя записи, я ожидаю, по крайней мере, некоторой конкуренции за блокировку общих данных. Этот конфликт - теоретически - может отрицательно повлиять на производительность.

Для сценариев только для чтения я не могу представить себе причину снижения производительности каталогов с большим количеством записей.

Ответ принят как подходящий

Вот несколько советов от кого-то, у кого есть среда, в которой у нас есть папки, содержащие десятки миллионов файлов.

  1. Папка хранит информацию индекса (ссылки на дочерние файлы и дочернюю папку) в файле индекса. Этот файл станет очень большим, когда у вас будет много детей. Обратите внимание, что он не делает различий между дочерним элементом, представляющим собой папку, и дочерним элементом, представляющим собой файл. Единственная разница в том, что содержимое этого дочернего элемента является либо индексом дочерней папки, либо данными дочернего файла. Примечание: я несколько упрощаю это, но это дает понять.
  2. Индексный файл будет фрагментирован. Когда он станет слишком фрагментированным, вы не сможете добавлять файлы в эту папку. Это связано с тем, что количество разрешенных фрагментов ограничено. Это по замыслу. Я подтвердил это в Microsoft при обращении в службу поддержки. Поэтому, хотя теоретический предел количества файлов, которые вы можете иметь в папке, составляет несколько миллиардов, удачи, когда вы начнете обрабатывать десятки миллионов файлов, поскольку вы сначала столкнетесь с ограничением фрагментации.
  3. Однако не все так плохо. Вы можете использовать инструмент: contig.exe для дефрагментации этого индекса. Это не уменьшит размер индекса (который может достигать нескольких гигабайт для десятков миллионов файлов), но вы можете уменьшить количество фрагментов. Примечание. Инструмент дефрагментации диска НЕ ​​выполняет дефрагментацию индекса папки. Он будет дефрагментировать данные файла. Только инструмент contig.exe выполнит дефрагментацию индекса. К вашему сведению: вы также можете использовать это для дефрагментации данных отдельного файла.
  4. Если вы ДЕФРАГМИРУЕТЕ, не ждите, пока вы достигнете максимального количества фрагментов. У меня есть папка, в которой я не могу дефрагментировать, потому что я ждал, пока не станет слишком поздно. Мой следующий тест - попытаться переместить некоторые файлы из этой папки в другую, чтобы посмотреть, смогу ли я затем дефрагментировать их. Если это не удастся, то мне нужно будет 1) создать новую папку. 2) переместите пакет файлов в новую папку. 3) дефрагментировать новую папку. повторяйте # 2 и # 3, пока это не будет сделано, а затем 4) удалите старую папку и переименуйте новую папку, чтобы она соответствовала старой.

Чтобы ответить на ваш вопрос более прямо: если вы просматриваете 100 тысяч записей, не беспокойтесь. Идите в нокаут. Если вы смотрите на десятки миллионов записей, то либо:

a) Планируйте разделить их на подпапки (например, допустим, у вас есть 100 миллионов файлов. Лучше хранить их в 1000 папок, чтобы у вас было только 100 000 файлов в папке, чем хранить их в одной большой папке. Это создаст 1000 индексов папок вместо одного большого, который с большей вероятностью достигнет максимального количества фрагментов или

б) Запланируйте запуск contig.exe на регулярной основе, чтобы индекс вашей большой папки оставался дефрагментированным.

Читайте ниже, только если вам скучно.

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

Итак, у вас есть сегмент данных, в котором хранятся указатели на фрагменты данных каталога. Данные каталога хранят информацию о подкаталогах и подфайлах, которые предположительно хранятся в каталоге. На самом деле каталог ничего не «хранит». Это просто функция отслеживания и представления, которая представляет для пользователя иллюзию иерархии, поскольку сам носитель данных является линейным.

Где я могу найти дополнительную информацию о contig.exe, его нет на моем сервере. Поиск в Google вернул эта страница технет, в котором не упоминаются подкаталоги или дефрагментация индекса папок.

Evan Carroll 25.06.2010 21:25

Я узнал о фрагментации индексов контигов и папок во время телефонного разговора с инженером Microsoft. Их бесполезная техническая поддержка 1-3 уровня была огромной головной болью. (Эээ ... вы пробовали запустить chkdsk? Можете попробовать открыть папку в проводнике Windows? Можете ли вы проверить права доступа к папке?) FOOL! Я не собираюсь сидеть здесь 7 дней и ждать, пока ваш чертов chkdsk просканирует диск с десятками миллионов файлов !!

MrB 26.06.2010 08:07

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

ss2k 25.03.2011 22:16

@ ss2k - Просто укажите contig.exe в каталог, я считать, который выполнит эту работу: contig -a . дает: C:\temp\viele-Dateien is in 411 fragments Summary: Number of files processed : 1 Average fragmentation : 411 frags/file

Lumi 25.08.2011 14:37

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

Quantum Elf 02.03.2014 05:30

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

Marco van de Voort 07.05.2015 12:56

Это все еще проблема с SSD-дисками? Придется сделать папку с огромным количеством ярлыков внутри (около 6 мил). Я попробовал contig.exe в другой папке меньшего размера, и я вижу, что он очень фрагментирован (1075 фрагментов), но contig не дефрагментирует его.

GPhilo 26.06.2017 11:21

@GPhilo Я могу подтвердить, что производительность SSD все еще снижается при использовании миллионов файлов. Я тоже пытался дефрагментировать папку, но contig ничего не сделал. Он действовал так, как если бы он был завершен, но демонстрировал одинаковую фрагментацию до и после запуска.

Bram Vanroy 06.09.2017 17:19

@mrb 'Если вы ДЕФРАГМИРУЕТЕ, не ждите, пока вы достигнете максимального количества фрагментов.' сбивает с толку. Текущая формулировка подразумевает, что дефрагментация не является обязательной, и ее следует учитывать после того, как вы решили дефрагментировать, что, я уверен, неверно. Было бы лучше прочитать: «Если вы думаете, что вам может понадобиться дефрагментация, не ждите, пока вы наберете максимальное количество фрагментов»?

mikemaccana 30.05.2018 14:21

Что касается запуска Contig для дефрагментации индекса, следует ли мне запускать contig на c:\my\big\directory, c:\my\big\directory\* или $mft? (или что-то другое?)

Stephen R 27.06.2018 22:55

(Что касается приведенного выше sorta-ответа @Lumi, когда я указываю его на каталог, он, кажется, сканирует каждый отдельный файл в каталоге. Поэтому ответ остается неясным)

Stephen R 27.06.2018 23:09

Влияет ли дефрагментация метаданных NTFS с помощью contig на работающую систему и как долго она обычно работает? Речь идет о ~ 8 миллионах файлов, занимающих 8 ТБ места.

Janis Veinbergs 17.04.2020 10:21

Также есть проблемы с производительностью, связанные с созданием коротких имен файлов, что замедляет работу. Microsoft рекомендует отключать создание коротких имен файлов, если в папке более 300 КБ файлов [1]. Чем менее уникальны первые 6 символов, тем сложнее.

[1] Как работает NTFS от http://technet.microsoft.com, поиск "300 000"

Я бы добавил сюда цитату If you use large numbers of files in an NTFS folder (300,000 or more), disable short-file name generation for better performance, and especially if the first six characters of the long file names are similar. - избавляет от поиска подсказки "300 000". Кстати: набрать "300" будет достаточно (= здесь нет необходимости в буфере обмена)

Wolf 19.04.2017 13:55

Я создаю файловую структуру для размещения до 2 миллиардов (2 ^ 32) файлов и выполнил следующие тесты, которые показывают резкое падение производительности навигации + чтения примерно при 250 файлах или 120 каталогах на каталог NTFS на твердотельном накопителе ( SSD):

  • Производительность файлов падает на 50% между 250 и 1000 файлами.
  • Производительность каталогов падает на 60% между 120 и 1000 каталогами.
  • Значения для чисел> 1000 остаются относительно стабильными

Интересно, что количество каталогов и файлов существенно НЕ мешает.

Итак, уроки таковы:

  • Номера файлов выше 250 стоят множитель 2.
  • Каталоги выше 120 стоят коэффициент 2,5.
  • Проводник в Windows 7 может обрабатывать большие файлы #Files или #Dirs, но удобство использования по-прежнему оставляет желать лучшего.
  • Внедрение подкаталогов не дорого

Это данные (2 измерения для каждого файла и каталога):

(FOPS = File Operations per Second)
(DOPS = Directory Operations per Second)

#Files  lg(#)   FOPS    FOPS2   DOPS    DOPS2
   10   1.00    16692   16692   16421   16312
  100   2.00    16425   15943   15738   16031
  120   2.08    15716   16024   15878   16122
  130   2.11    15883   16124   14328   14347
  160   2.20    15978   16184   11325   11128
  200   2.30    16364   16052   9866    9678
  210   2.32    16143   15977   9348    9547
  220   2.34    16290   15909   9094    9038
  230   2.36    16048   15930   9010    9094
  240   2.38    15096   15725   8654    9143
  250   2.40    15453   15548   8872    8472
  260   2.41    14454   15053   8577    8720
  300   2.48    12565   13245   8368    8361
  400   2.60    11159   11462   7671    7574
  500   2.70    10536   10560   7149    7331
 1000   3.00    9092    9509    6569    6693
 2000   3.30    8797    8810    6375    6292
10000   4.00    8084    8228    6210    6194
20000   4.30    8049    8343    5536    6100
50000   4.70    7468    7607    5364    5365

А это тестовый код:

[TestCase(50000, false, Result = 50000)]
[TestCase(50000, true, Result = 50000)]
public static int TestDirPerformance(int numFilesInDir, bool testDirs) {
    var files = new List<string>();
    var dir = Path.GetTempPath() + "\Sub\" + Guid.NewGuid() + "\";
    Directory.CreateDirectory(dir);
    Console.WriteLine("prepare...");
    const string FILE_NAME = "\file.txt";
    for (int i = 0; i < numFilesInDir; i++) {
        string filename = dir + Guid.NewGuid();
        if (testDirs) {
            var dirName = filename + "D";
            Directory.CreateDirectory(dirName);
            using (File.Create(dirName + FILE_NAME)) { }
        } else {
            using (File.Create(filename)) { }
        }
        files.Add(filename);
    }
    //Adding 1000 Directories didn't change File Performance
    /*for (int i = 0; i < 1000; i++) {
        string filename = dir + Guid.NewGuid();
        Directory.CreateDirectory(filename + "D");
    }*/
    Console.WriteLine("measure...");
    var r = new Random();
    var sw = new Stopwatch();
    sw.Start();
    int len = 0;
    int count = 0;
    while (sw.ElapsedMilliseconds < 5000) {
        string filename = files[r.Next(files.Count)];
        string text = File.ReadAllText(testDirs ? filename + "D" + FILE_NAME : filename);
        len += text.Length;
        count++;
    }
    Console.WriteLine("{0} File Ops/sec ", count / 5);
    return numFilesInDir; 
}

Вы видите потерю производительности после 2 ^ 8 файлов, потому что вам нужно отключить генерацию коротких имен (генерация 8-символьных имен). См. technet.microsoft.com/en-us/library/cc781134(v=ws.10).aspx

Kyle Falconer 15.06.2015 21:26

Привет, я попробовал это с помощью этой командной строки: fsutil.exe behavior set disable8dot3 1 После перезагрузки результаты были в основном такими же для менее чем 10000 файлов / каталогов. В статье говорится, что это важно только для больших чисел. Но то, что я увидел, было общим перфомансом. деградация, возможно, из-за более высокого коэффициента загрузки моего SSD (теперь он заполнен на 80% вместо 45%)

Spoc 25.10.2015 11:32

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

Adrian Maire 10.01.2017 18:49

Даже после отключения генерации имени 8.3 вам все равно нужно полоска существующих имен 8.3, иначе будет мало улучшений в перечислении существующих файлов.

Stephen R 27.06.2018 22:26

подробнее: blogs.technet.microsoft.com/josebda/2012/11/13/…

Stephen R 27.06.2018 22:53

NTFS хранит каталоги как B-деревья. Те точки, где вы видите резкие изменения в производительности, - это просто когда B-дерево становится на один уровень глубже из-за роста. Эти точки могут различаться в зависимости от длины имени файла (поскольку NTFS пытается уместить столько записей в каждом узле B-дерева 4K, сколько позволяет пространство, а длина имени файла определяет размер каждой записи), а также от того, включены ли короткие имена ( потому что тогда NTFS, возможно, придется добавить две записи в файл вместо одной).

Craig Barkhouse 29.04.2020 05:15

У меня был реальный опыт работы с примерно 100 000 файлов (каждый по несколько МБ) в NTFS в каталоге при копировании одной онлайн-библиотеки.

Открытие каталога с помощью проводника или 7-zip занимает около 15 минут.

Написание копии сайта с winhttrack всегда будет зависать через некоторое время. Речь шла и о директории, содержащей около 1 000 000 файлов. Я думаю, что хуже всего то, что MFT можно пройти только последовательно.

Открытие того же самого под ext2fsd на ext3 дало почти то же время. Возможно, переход на reiserfs (не reiser4fs) может помочь.

Лучше всего попытаться избежать этой ситуации.

Для ваших собственных программ использование BLOB-объектов без каких-либо fs может быть полезным. Вот как Facebook хранит фотографии.

Я не уверен, откуда вы взяли, что «MFT можно проходить только последовательно»? MFT содержит B-дерево и рассматривается как B-дерево.

phuclv 15.08.2018 18:07

Другие вопросы по теме