Самый оптимизированный способ хранения состояний сканера?

StackOverflow https://stackoverflow.com/questions/1729427

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Еще один быстрый способ сохранить состояние вашего приложения — использовать соленый огурец для сериализации состояния вашего приложения на диск.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top