Самый быстрый доступ к файлам/хранение?

У меня есть около 750 000 000 файлов, которые мне нужно хранить на диске. Более того, мне нужно иметь возможность доступа к этим файлам случайным образом — к любому файлу в любое время — в кратчайшее возможное время. Что мне нужно сделать, чтобы ускорить доступ к этим файлам?

Думайте об этом как о хеш-таблице, только хеш-ключи являются именами файлов, а связанные значения — это данные файлов.

Коллега сказал организовать их в каталоги следующим образом: если я хочу сохранить файл с именем «foobar.txt», и он хранится на диске D:, поместите файл в «D:\f\o\o\b\a \г.\т\х\т". Однако он не мог объяснить, почему это была хорошая идея. Есть ли что-нибудь в этой идее?

Есть идеи?

Суть в том, чтобы найти файл. Как быстрее всего найти файл по имени для открытия?

РЕДАКТИРОВАТЬ:

  • У меня нет контроля над файловой системой, в которой хранятся эти данные. Это будет NTFS или FAT32.
  • Хранение файловых данных в базе данных невозможно.
  • Файлы будут очень маленькими - максимум, вероятно, 1 КБ.
  • Диски будут твердотельными.
  • Доступ к данным практически случайный, но я, вероятно, мог бы определить приоритет для каждого файла в зависимости от того, как часто он запрашивается. Доступ к некоторым файлам будет гораздо больше, чем к другим.
  • Элементы будут постоянно добавляться, а иногда и удаляться.
  • Было бы непрактично объединять несколько файлов в один файл, поскольку между файлами нет логической связи.
  • Я хотел бы собрать некоторые показатели, запустив тесты на этом материале, но это усилие может стать таким же трудоемким, как и сам проект!
  • РЕДАКТИРОВАТЬ2:

    Я хочу проголосовать за несколько подробных ответов, независимо от того, верны они или нет, и не могу из-за моего статуса новичка. Извините ребята!


    person JamesBrownIsDead    schedule 07.11.2009    source источник
    comment
    Являются ли эти данные статическими (это 750 миллионов) или вы добавляете к ним (периодически добавляете больше файлов)? Может ли он быть только для чтения или вам также нужно иметь возможность обновлять файлы? Действительно ли это случайный доступ к файлам или есть какие-то шаблоны доступа, которые вы можете обнаружить при ближайшем рассмотрении?   -  person Scanningcrew    schedule 07.11.2009
    comment
    Обновленный вопрос, чтобы ответить на это. (Больше файлов добавляются на периодической основе, файлы удаляются довольно редко. Доступ случайный, но к некоторым файлам будут обращаться гораздо чаще, чем к другим.)   -  person JamesBrownIsDead    schedule 07.11.2009
    comment
    Что касается вашего комментария EDIT2, вам нужно всего 15 представителей, чтобы проголосовать. Подробнее см. stackoverflow.com/faq.   -  person Greg Hewgill    schedule 07.11.2009


    Ответы (10)


    Похоже, это будет в значительной степени вопрос выбора файловой системы. Одним из возможных вариантов может быть ZFS, он предназначен для приложений с большим объемом.

    Вы также можете рассмотреть возможность использования реляционной базы данных для такого рода вещей. 750 миллионов строк — это база данных среднего размера, поэтому любая надежная СУБД (например, PostgreSQL) сможет с этим справиться. хорошо. Вы также можете хранить произвольные большие двоичные объекты в базе данных, поэтому все, что вы собираетесь хранить в файлах на диске, вы можете просто сохранить в самой базе данных.

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

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

    person Greg Hewgill    schedule 07.11.2009
    comment
    Решение для базы данных будет работать хорошо, но может быть не быстрее. Я был бы очень осторожен в догадках, не проведя сначала несколько тестов. Поиск файла через индекс БД означает использование дерева поиска. Предлагаемое решение реализации trie на основе каталогов также разрешает доступ к Olog(n) через дерево, но разбиение его по буквам означает, что у вас не так много контроля над тем, как разбиваются узлы. Шаблоны в именах файлов могут привести к огромному узлу. - person J. Loomis; 07.11.2009
    comment
    Да, я бы не стал утверждать, что база данных будет быстрее, но это еще один вариант, который следует рассмотреть. Однако базы данных предназначены для обработки ключей строкового типа с произвольными патологическими шаблонами. :) - person Greg Hewgill; 07.11.2009

    Этот файловый алгоритм будет работать, но он не оптимален. Я бы подумал, что использование двух- или трехсимвольных «сегментов» будет лучше для производительности, особенно когда вы начинаете задумываться о создании резервных копий.

    Например:
    d:\storage\fo\ob\ar\foobar.txt
    или
    d:\storage\foo\bar\foobar.txt

    Использование такого алгоритма имеет ряд преимуществ:

    1. Доступ к базе данных не требуется.
    2. Файлы будут разбросаны по многим каталогам. Если вы не распространите их, вы столкнетесь с серьезными проблемами производительности. (Я смутно припоминаю, что слышал о том, что у кого-то были проблемы с ~40 000 файлов в одной папке, но я не уверен в этом числе.)
    3. Нет необходимости искать файл. Вы можете точно определить, где будет находиться файл, по имени файла.
    4. Простота. Вы можете очень легко перенести этот алгоритм практически на любой язык.

    Есть в этом и минусы:

    1. Многие каталоги могут привести к медленному резервному копированию. Представьте себе выполнение рекурсивных различий в этих каталогах.
    2. Масштабируемость. Что произойдет, если у вас закончится место на диске и вам нужно добавить больше памяти?
    3. Имена ваших файлов не могут содержать пробелы.
    person Matthew Cole    schedule 07.11.2009

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

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

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

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

    Итак, я бы сохранил foobar.txt как f/o/o/b/foobar.txt.

    person Siddhartha Reddy    schedule 07.11.2009

    Это сильно зависит от многих факторов:

    • Какую файловую систему вы используете?
    • Насколько велик каждый файл?
    • Какой тип дисков вы используете?
    • Каковы схемы доступа?

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

    Если вы можете объяснить шаблон доступа, вы можете использовать локальность ссылок для размещения этих файлов.

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

    Обновлять:

    Учитывая ваше обновление, возможно ли, что вы консолидируете некоторые файлы? Файлы размером 1k не очень эффективно хранить, поскольку файловые системы (fat32, ntfs) имеют размер кластера, и каждый файл все равно будет использовать размер кластера, даже если он меньше размера кластера. Обычно существует ограничение на количество файлов в каждой папке из-за проблем с производительностью. Вы можете провести простой тест, поместив в папку до 10 000 файлов, чтобы увидеть, насколько снижается производительность.

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

    person rxin    schedule 07.11.2009

    Во-первых, размер файла очень маленький. Любая файловая система займет как минимум в 4 раза больше места. Я имею в виду, что любой файл на диске будет занимать 4 КБ для файла размером 1 КБ. Особенно на SSD-дисках сектор размером 4 КБ будет нормой.

    Таким образом, вам нужно сгруппировать несколько файлов в 1 физический файл. 1024 файла в 1 файле хранилища кажется разумным. Чтобы найти отдельные файлы в этих файлах хранилища, вы должны использовать некоторую СУБД (упомянута PostgreSQL, и это хорошо, но SQLite может лучше подходить для этого) или аналогичную структуру для выполнения сопоставления.

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

    Если вы можете, не позволяйте им форматировать FAT32, по крайней мере, NTFS или какой-либо недавний вариант файловой системы Unix. Поскольку общий размер файлов не такой большой, NTFS может быть достаточно, но ZFS - лучший вариант...

    person Malkocoglu    schedule 07.11.2009

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

    person Amber    schedule 07.11.2009

    Почему неприемлемо сохранение путей в таблице базы данных?

    person Raj    schedule 07.11.2009

    Я предполагаю, что он думает о структуре данных Trie для создания на диске, где узел является каталог.

    person Scanningcrew    schedule 07.11.2009

    Я бы проверил модель hadoops.

    P

    person Paul    schedule 07.11.2009

    Я знаю, что это с опозданием на несколько лет, но, возможно, это поможет следующему парню.

    Я предлагаю использовать SAN, сопоставленную с диском Z, на который могут сопоставляться и другие серверы. Я бы не стал использовать путь к папке, который сказал ваш друг, но больше с диском:\clientid\год\месяц\день\ и если вы проглатываете более 100 тысяч документов в день, вы можете добавлять подпапки в течение часа и даже минуту, если это необходимо. Таким образом, у вас никогда не будет более 60 подпапок, а если потребуется, то вплоть до секунд. Сохраняйте ссылки в SQL для быстрого поиска и составления отчетов. Это делает путь к папке довольно коротким, например: Z:\05\2004\02\26\09\55\filename.txt, поэтому вы не столкнетесь с ограничениями 256 по всем направлениям.

    Надеюсь, это поможет кому-то. :)

    person Switch    schedule 26.02.2014