2013-05-30 5 views
1

После поиска вокруг некоторое время относительно консенсуса в том, как обращаться с мультимедийным контентом для сайта (с использованием собственных FileSystem или базы данных BLOB), в основном здесь:Оптимизация структуры каталогов в файловой системе (ссылка через базу данных)

MySQL Binary Storage using BLOB VS OS File System: large files, large quantities, large problems

Я решил, что пойдет с сохранением непосредственно в файловой системе и установит ссылки на пути в базе данных. Я в основном разрабатываю веб-приложение, которое будет содержать множество изображений (в основном около 5MB до 10MB) и видео (в основном около 50MB до 100MB).

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

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

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

+0

Скорость поиска в каталоге зависит от типа каталога и размера и кэширования каталогов. Размер (количество записей), поскольку при первом открытии файла каталог должен быть отсканирован. Поэтому, если вы можете ограничить количество каталогов и количество записей в каталоге, необходимых для первого поиска, который является выигрышем. Названия каталогов Hashed могут быть подходящими для этого. Повторные поиски должны найти информацию о кешированном каталоге. Чтобы сохранить время сканирования. В некоторых системах, таких как Solaris. это называется настройкой настройки кэша дескриптора каталогов и включает системные настройки. –

+0

@jimmcnamara, так что я должен работать над созданием наилучшего решения для кэширования каталогов? так как кумулятивный размер всех каталогов не сильно под моим контролем – activatedgeek

+0

Работайте над обоими. Простой пример: хэш с хорошей лавиной может позволить вам создать 100 каталогов. Хорошая лавина означает, что хеш-код будет распространять файл довольно равномерно по каталогам. Так.Хешируйте имя файла в десятичное число (или какую-то строку). Используйте первые два символа этого числа/строки в качестве имени каталога. Запишите файл в этот каталог. В некотором смысле я предполагаю, что вы используете свое приложение. По мере увеличения количества записей в каталоге время сканирования увеличивается. Я предполагаю, что вам дано правильное имя файла для поиска. –

ответ

0

Возможно, будет поздно к игре на этом. Но одно решение (если оно подходит вашему прецеденту) может быть хэшированием имени файла. Это способ создания легко воспроизводимого пути к файлу с использованием имени файла, а также создания хорошо распределенной структуры каталогов. Например, вы можете использовать байты хэш-код имя файла, как это путь:

String fileName = "cat.gif"; 
int hash = fileName.hashCode(); 
int mask = 255; 
int firstDir = hash & mask; 
int secondDir = (hash >> 8) & mask; 

Это приведет к тому пути, по которому:

/172/029/cat.gif 

Вы можете найти cat.gif в структуре каталогов путем воспроизведения алгоритм.

Использование HEX в качестве имен каталогов будет столь же легко, как преобразование int значения:

String path = new StringBuilder(File.separator) 
     .append(String.format("%02x", firstDir)) 
     .append(File.separator) 
     .append(String.format("%02x", secondDir) 
     .toString(); 

, в результате чего:

/AC/1D/cat.gif 

я написал и статью об этом несколько лет назад, и недавно переехал это к Среднему. Он содержит несколько подробностей и пример кода: File Name Hashing: Creating a Hashed Directory Structure. Надеюсь это поможет!