Каков наилучший способ хранить тысячи изображений в структуре папок Windows?

У нас есть сотни тысяч изображений jpg в структуре папок Windows, подобных этой, но с ними очень сложно взаимодействовать и работать с ними быстро (перечисление занимает много времени, копирование требует времени и т. Д.). Вот структура:

images/
  1/
    10001/
      10001-a.jpg
      10001-b.jpg
      ...
      10001-j.jpg (10 images in each XXXXX folder)
    10002/
    10003/
    ...
    19999/
  2/
    20001/
    20002/
    20003/
    ...
    29999/
  3/
  4/
  5/
  6/
  7/
  8/
  9/

Теперь просмотр этих изображений немного медленный, потому что есть ок. 10 000 папок в каждой папке X и перечисление тех просто занимает время.

Есть ли лучший способ организовать изображения с меньшим количеством подпапок / элементов? Повлияет ли изменение структуры на это?

images/
  1/
    0/
      0/
        0/
          0/
          1/
          2/
          3/
          4/
          5/
          6/
          7/
          8/
          9/
          10000/ (image folder, same as path)
            10000-a.jpg
            10000-b.jpg
            ...
            10000-j.jpg (10 images in each image folder)
        1/
        2/
        3/
        4/
        5/
        6/
        7/
        8/
        9/
      1/
      2/
      3/
      4/
      5/
      6/
      7/
      8/
      9/
    1/
    2/
    3/
    4/
    5/
    6/
    7/
    8/
    9/
  2/
  3/
  4/
  5/
  6/
  7/
  8/
  9/

Таким образом, расположение изображения 48617-c.jpg будет равно пути 4/8/6/1/7/48617/48617-c.jpg.

Причина наличия отдельной папки с полным номером пути 48617 состоит в том, чтобы упростить копирование всего пакета из 10 изображений (путем копирования всей папки).

Теперь... ни в одной папке не будет более 11 непосредственных подпапок, но будет много дополнительных однозначных папок для разделения. Ускорит ли эта настройка просмотр и взаимодействие, когда несколько пользователей будут добавлять / копировать / удалять / и т. Д.?

3 ответа

Windows немного особенная, когда дело доходит до макета папок с каджиллионами файлов. Особенно изображения, так как Windows Explorer относится к ним особенным. Тем не менее, есть несколько руководящих принципов, чтобы следовать, чтобы вещи не выходили из-под контроля:

  • Если по какой-либо причине вы намерены просмотреть структуру каталогов в проводнике Windows, храните в каталоге не более 10000 записей (файлы и подкаталоги).
  • Если вы будете взаимодействовать с ним исключительно из клиентских утилит или кода, ограничение в 10 КБ будет гораздо более гибким.
  • Не создавайте слишком много подкаталогов, каждый создаваемый вами каталог - это еще одна отдельная операция, которую копия должна выполнять при копировании.
    • Если каждый файл создает N каталогов, число объектов файловой системы, созданных этим файлом, будет 1+N, что линейно масштабирует время копирования.
    • Короткое экспоненциальное дерево (т. Е. Три уровня каталогов, каждый с 256 подкаталогами) может удивительно масштабироваться до того, как вы достигнете предела 10K/per-directory.
  • Если вы обращаетесь к нему с помощью кода, перейдите к прямому открытию вместо анализа списков каталогов перед открытием. Сбой fopen(), за которым следует сканирование каталогов, выполняется быстрее, чем dir-сканирование, за которым следует во многих случаях гарантированный fopen().

Предостережения:

  • Количество файлов является неизменным, но количество каталогов зависит от вас. Сумма этих двух показателей влияет на скорость выполнения операций копирования.
  • Постарайтесь, если это вообще возможно, не просматривать Windows Explorer, если это не нужно. Он плохо справляется с большими каталогами, и вы ничего не можете с этим поделать.

В моем ответе много полезной информации о математике. Как влияет сложность каталогов на i-узлы?

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

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

В зависимости от того, есть ли у вас ресурсы для разработки такой системы, это звучит как хороший кандидат для базы данных SQL Server, использующей хранилище файлов FILESTREAM. Таким образом, вы оставляете организацию каталогов на SQL Server, и все, о чем вам нужно беспокоиться, это как вы сами управляете данными. Возможно, вы могли бы использовать SQL Express, поскольку данные FILESTREAM не учитываются при расчете размера базы данных.

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