Лучший способ хранить / извлекать миллионы файлов, когда их метаданные находятся в базе данных SQL - PullRequest
8 голосов
/ 11 августа 2009

У меня есть процесс, который первоначально генерирует 3-4 миллиона файлов PDF, и продолжается со скоростью 80K / день. Они будут довольно маленькими (50 КБ) каждый, но меня беспокоит то, как управлять общей массой файлов, которые я генерирую, для удобства поиска. Некоторые детали:

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

Изначально я планировал записать все эти файлы в один каталог на NAS, но я понимаю, что это может быть не очень хорошей идеей, поскольку их миллионы, а Windows может не справиться с поиском в миллион файлов изящно. Я ищу совет:

  1. С одной папкой все в порядке? Файлы никогда не будут перечислены - они будут получены только с помощью System.IO.File с именем файла, которое я уже определил.
  2. Если я создаю папку, могу ли я наблюдать за новыми файлами с System.IO.DirectoryWatcher, даже с таким количеством файлов, или он начнет медленно работать с таким количеством файлов?
  3. Должны ли они храниться в виде больших двоичных объектов в базе данных SQL Server? Поскольку мне нужно получить их по справочному значению, возможно, это имеет больше смысла.

Спасибо за ваши мысли!

Ответы [ 12 ]

0 голосов
/ 11 августа 2009

1) Это полностью противоречит тому, что я обычно проповедую, но вы можете сохранить их в базе данных SQL, так как они представляют собой небольшие файлы. SQL Server также позволил бы вам быстро и легко находить нужные вам файлы без сумасшедшей очистки диска, обычно связанной с перечислением такого большого каталога. Кроме того, хранение файлов в SQL (хотя я вообще против) значительно упростит процесс резервного копирования / восстановления.

2) Сохраните их все в каталогах и либо проиндексируйте их с помощью службы индексации Windows ( shivers ), либо создайте свой собственный индекс в SQL Server, который будет содержать имя файла и полный путь , Я бы предложил хранить их в отдельных каталогах, всего по несколько десятков тысяч файлов в каждом. Возможно, вы могли бы использовать год заказа в качестве имени папки?

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

Надеюсь, это поможет!

0 голосов
/ 11 августа 2009

Вопрос:

Почему эти документы необходимо создавать и хранить в формате PDF?

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

...