Самый оптимизированный способ хранения состояний сканера? - PullRequest
3 голосов
/ 13 ноября 2009

В настоящее время я пишу сканер для веб-сайтов (использую инфраструктуру Python scrapy ).
Недавно мне пришлось внедрить систему паузы / возобновления.
Решение, которое я реализовал, является самым простым и, в основном, сохраняет ссылки, когда они запланированы, и помечает их как «обработанные», как только они на самом деле.
Таким образом, я могу получить эти ссылки (очевидно, что при возобновлении паука хранится немного больше, чем просто URL, значение глубины, домен, к которому относится ссылка и т. Д.), И пока все работает хорошо.

Прямо сейчас, я только что использовал таблицу mysql для выполнения этих действий с хранилищем, в основном для быстрого прототипирования.

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

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

Заранее спасибо за предложения

Ответы [ 2 ]

3 голосов
/ 13 ноября 2009

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

Ваше конкретное приложение может быть дополнительно оптимизировано, поскольку оно не обязательно требует 100% надежности - если вы пропустите запись нескольких записей из-за внезапного сбоя, ну, вы просто будете сканировать их снова. Таким образом, ваш файл журнала может быть буферизован и не должен быть одержимо fsync'ed.

Я полагаю, что структура поиска также удобно помещалась бы в памяти (если бы это было только для нескольких десятков сайтов, вы могли бы просто хранить набор со всеми их URL-адресами, без необходимости использования фильтров Блума или чего-то необычного) - если бы это не так t, возможно, вам придется хранить в памяти только набор последних записей и периодически выгружать этот набор на диск (например, объединяя все записи в файл Berkeley DB ); но я не буду вдаваться в мучительные подробности об этих опциях, так как не похоже, что они вам потребуются.

1 голос
/ 13 ноября 2009

Был разговор на PyCon 2009, который может вас заинтересовать, Точное восстановление состояния и перезапуск для приложений анализа данных Биллом Грибблом.

Другим быстрым способом сохранения состояния приложения может быть использование pickle для сериализации состояния приложения на диск.

...