Самый оптимизированный способ хранения состояний сканера?
-
19-09-2019 - |
Вопрос
В настоящее время я пишу веб-сканер (используя платформу Python царапающий).
Недавно мне пришлось реализовать систему паузы/возобновления.
Решение, которое я реализовал, является простейшим и, по сути, сохраняет ссылки, когда они запланированы, и помечает их как «обработанные», когда они действительно есть.
Таким образом, я могу получить эти ссылки (очевидно, там хранится немного больше, чем просто URL-адрес, значение глубины, домен, которому принадлежит ссылка и т. д.) при возобновлении работы паука, и пока все работает хорошо.
Прямо сейчас я только что использовал таблицу MySQL для обработки этих действий с хранилищем, в основном для быстрого прототипирования.
Теперь мне хотелось бы знать, как можно это оптимизировать, поскольку я считаю, что база данных не должна быть единственным доступным вариантом.Под оптимизацией я подразумеваю использование очень простой и легкой системы, при этом позволяющей обрабатывать большой объем данных, записанных за короткое время.
На данный момент он должен быть способен обрабатывать несколько десятков доменов, что означает сохранение нескольких тысяч ссылок в секунду...
Заранее спасибо за предложения
Решение
Самый быстрый способ сохранить данные — это обычно просто добавить их в журнал — такой полностью последовательный шаблон доступа сводит к минимуму операции поиска на диске, которые обычно составляют большую часть затрат времени на хранение.После перезапуска вы перечитываете журнал и перестраиваете структуры памяти, которые вы также создавали на лету, когда изначально добавляли в журнал.
Ваше конкретное приложение может быть дополнительно оптимизировано, поскольку оно не обязательно требует 100% надежности — если вы пропустите запись нескольких записей из-за внезапного сбоя, ну что ж, вы просто просканируете их снова.Таким образом, ваш файл журнала может быть буферизован и не нуждается в навязчивой fsync.
Я полагаю, что структура поиска также будет удобно помещаться в памяти (если это всего лишь несколько десятков сайтов, вы, вероятно, могли бы просто сохранить набор со всеми их URL-адресами, без необходимости использования фильтров Bloom или чего-то необычного) - если это не так, вы возможно, придется хранить в памяти только набор последних записей и периодически сбрасывать этот набор на диск (например, объединяя все записи в Беркли ДБ файл);но я не буду вдаваться в мучительные подробности об этих опциях, поскольку, судя по всему, они вам не потребуются.
Другие советы
На PyCon 2009 был доклад, который может показаться вам интересным. Точное восстановление состояния и перезапуск для приложений анализа данных Билл Гриббл.
Еще один быстрый способ сохранить состояние вашего приложения — использовать соленый огурец для сериализации состояния вашего приложения на диск.