div При парсинге веб-сайтов часто возникает задача хранения большого к

1
2
3
4
5
6
7
<div><p>При парсинге веб-сайтов часто возникает задача хранения большого количества файлов, например, картинок товаров. Файловая система устроена так, что работа с ней замедляется, когда в одной директории находится большое количество файлов, точных цифр я назвать не могу, но я однозначно не рекомендую хранить в одной директории 100 тысяч картинок и даже 10 тысяч.</p>
<p>Как быть?</p>
<p>Разбивать файлы на группы и хранить группы в разных директориях. Желательно применять такой метод разбивки на группы, чтобы файлы распределялись равномерно по директориям. Тут мы опять же можем столкнутьяс с проблемой, что будет слишком много уже не файлов, а директорий. Выход такой: создаём директории первого уровня, в каждой создаём директории второго уровня и только уже в них храним файлы.</p>
<p>Равномерно распеределить файлы по директориям нам помогут хэш-функции, например, <a href="http://ru.wikipedia.org/wiki/MD5">MD5</a> или <a href="http://ru.wikipedia.org/wiki/SHA-1">SHA1</a>. Что такое хэш? Это большое число, которое получается в результате применения алгоритма хэша к входным данным. Например, MD5 выдаёт число в диапазоне от 0 до 2 в 128 степени т.е. 16-байтовое число, которое обычно запиывается в виде 32-х шестнадцатеричных чисел. Если мы будем брать различные данные, то генерируемый для них md5-хэш(число) будет равномерно распределятья по диапазону от 0 до 2^128. Равномерность распределения сохранится, даже если входные данных будут не сильно различаться. Особенностью хэша является то, что если мы возьмём кусочек хэша, например первые две 16-е цифры из записи MD5-хэша, то значения этого кучоска точно так же будут равномерно заполняться для различных входных данных.</p>
<p>Что нам это даёт в практическом плане. А вот что. Допустим мы скачали картинку, мы знаём её URL, применим к её URl хэш-функцию, для простоты, представим, что некая хэш-функция вернула нам результат abcdefgh, теперь разобъём результат на части: ab + cd + efgh, создадим директорию ab, далее в ней создадим директорию cd и в этой директории создадим файл efgh.jpg Если мы применим этот алгоритм для множества картинок, то в результате получим равномерное распеределение файлов по структуре dir1/dir2/filename.</p>
<p>В библиотеке <a href="http://grablib.org/">grab</a> есть несколько функций для работы с таким методом сохранения файлов. Во-первых, это модуль <a href="https://bitbucket.org/lorien/grab/src/tip/grab/tools/files.py?at=default">grab.tools.fiels</a>, в котором есь функция hashed_path, которая по введённому URl выдаёт путь к файлу в виде xx/yy/zzzzzz, где xx и yy это директории. Для хэширования функция hashed_path использует SHA-1 функцию. Тажке есть функция hashed_path_details, которая выдаёт структуру: {'directory': 'xx/yy', 'filename': 'zzzzzz', 'full_path': 'xx/yy/zzzzz'}<br><br>Также объект grab.response обладает методом <a href="https://bitbucket.org/lorien/grab/src/tip/grab/response.py?at=default#cl-238">save_hash</a>, который автоматически вычисляет путь по вышеописанному алгоритму, создаёт директории, если нужно и сохраняте туда содержимое grab.response.body</p></div>
[15:03:41] lorien: вот держи