Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Раскидать файлы по папкам

Автор: KurkSS
Дата сообщения: 21.08.2013 11:47
Имеем - будет хранить более 40 млн файлов.

Для одной папки этого много. Сейчас имя файла это sha1 от его оригинального имени
(которое естественно не случайно - а)часто расширение файла ави мп3 ехе... б)путь к файлу(логический) - тоже не случайная величина, и может получиться что для 20 млн из 40 это одно и тоже. тоесть хеш берём от строки ХХХХХХХХХХ-рандом-УУУУ
где Х часть и У часть константа.)

если пойти стандартным путём, брать первые три символа от хеша
substr(sha1('XXXXXXX-random-YYYYY'),0,3) - насколько можно быть увереным что я получу то что ожидаю

4096 папок, и в каждой расномерно расложены файлы (получиться по 10 000 на папку)

что не получиться что 100 папок будет содержать по 100 000 файлов.
????

и вопрос другой.
сам sha1 не быстрая функция.

ктото может подсказать быстрый и хороший способ.

ВХОД - имя файла полное PATH1/path2/.../pathN/file.ext

ВЫХОД
sys_file_name - системное имя по которому НЕЛЬЗЯ востановить оригинальное имя файла - естественно уникальное поле для базы данных.
sub_folder - при котором получим равномерное распределение файлов.

ЗЫ
вариант как на одном форуме - subfolder = autoincrement_field(pk) DIV 1000 (нацело)
не подходит. ибо после удаления и закачки новых файлов мы получим на 40 млн файлов 40 млн подпапок.

Добавлено:
НАПОМНИАЮ

ВХОД - имя файла полное PATH1/path2/.../pathN/file.ext
этот путь, это логическая структура, не связан с физическим хранением.

грубо говоря пользователь сам себе придумывает красивое имя для
foto.jpg -типо

/foto/my/2012/summer/july/Ibitca/ya-goliy/dlya_Veri/photoshop/prikol/mocha_v_golovu_idet_naporom/ya_durak/foto.jpg
Автор: XPEHOMETP
Дата сообщения: 21.08.2013 13:50
Подозреваю по описанию, что это FTP-хостинг для МР3-файлов, закачиваемых зарегистрированными юзверями. Которых явно будет не 40 лимонов. На каждого юзверя свою папку - не решение?
Автор: karlss0n
Дата сообщения: 21.08.2013 13:51
KurkSS
Разбиение по папкам именно через полученный HASH нужно делать?

Для равномерного распределения можно было бы сделать следующее:
1. Задать кол-во папок.
2. Завести табличку с описанием этих папок, в том числе поле со счётчиком файлов
3. Раскидывать файлы по кругу (а лучше запросом более свободный слот выбирать) во все папки, с файлом сохранять его физический путь.
4. При удалении файла у нас всегда есть папка, можно счётчик скрутить для этой папки

Тогда распределение будет управляемо.

Второй вариант - ввести в название файла время (милисекунды например) в открытом виде вместо random, в сутках 86.4 млн, следовательно для 4096 папок нужно делить на 21100. Но тут сложно будет добиться равномерного распределения. Какой алгоритм не бери распределение будет неуправляемо, т.к. нет ни одной константы в генерации имени файла.

Вам нужно постараться выделить больше параметров. Имени файла недостаточно.

Автор: KurkSS
Дата сообщения: 21.08.2013 22:09
не ребятки...давайте поднапрягёмся.

придумать нужно. даже наверно можно найти гуглом, только чёрт знает по каким словам. по очевидным - ничего не нашол дельного(простого)

из сложных примеров.
шифрование twofish - там для полного секьюрити используеться много раундов обработки блока, но уже при 4 раундах на выходе получаем последовательность из которой вырезая (нам надо 12 бит, а там по 16 байт блоки) - ну скажем для средних байтов беря байты через один и беря 2 средних бита - получаем таки равномернораспределёную случайную величину в 12 бит.

но шифрование это долгая песня. нам бы попроще.

ЗЫ
нащот разбияния по папкам.

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

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

имена файлов это хешированное значение логического имени.

Добавлено:
=========================
И нет, это не фтп хостинг, а именно веб .

и нет не музыка, а имено случайны пользовательские файлы.

статистика показывает что разрешая юзерам хранить своё барахло, получаем 250Кб средний размер файла.

если на сервере 10Тб размер для этого барахла, это таки 40млн файлов.
Автор: karlss0n
Дата сообщения: 22.08.2013 11:48
Вот не факт, что извращаясь с хэшированием будет быстрее, чем сделать запрос к табличке.
И опять же: НИКОГДА не получить абсолютно равномерного заполнения при хэшировании, т.к. на название файла влиять нет возможности.

Автор: Dmitry
Дата сообщения: 06.09.2013 08:23
karlss0n

Цитата:
Вот не факт, что извращаясь с хэшированием будет быстрее, чем сделать запрос к табличке.
И опять же: НИКОГДА не получить абсолютно равномерного заполнения при хэшировании, т.к. на название файла влиять нет возможности.


Криптостойкая хэш-функция (типа SHA1) специально спроектирована так чтобы давать как можно более равномерное распределение хэшей при самых минимальных изменениях во входных данных. Так что мне кажется что идея вполне жизнеспособная. Стоит попробовать.

Страницы: 1

Предыдущая тема: Embarcadero C++ Builder XE и русский текст из БД


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.