2009-11-13 3 views
3

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

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

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

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

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

ответ

3

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

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

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

+0

десятки сайтов, сканированных параллельно, но мне нужно будет отслеживать все выполненные в прошлом задания сканирования. Я думаю, – Sylvain

+0

также, если записывать последовательно в файл, как Ссылка «flag» как загружена? – Sylvain

+0

@Sylvain, то вам определенно нужно периодически «сбрасывать» внешний вид «установить» в более устойчивую форму поиска, а Berkeley DB может или не может плавно масштабироваться до миллионов или миллиардов ... вы будете нужно проверить, но я подозреваю, что PostgreSQL (или какой-то амбициозный нереляционный ключ/хранилище значений, но у меня мало опыта тех, кто помимо собственного Bigtable Google) действительно будет вашим лучшим подходом, если ваш масштаб будет достаточно гигантским.Ключевым моментом является то, что вам не нужно постоянно обновлять эту БД - используйте память и журналы, чтобы обновления БД были «раз в то время»! –

1

был разговор на PyCon 2009, которые вы можете найти интересные, Precise state recovery and restart for data-analysis applications Билл Gribble.

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

+0

Я уверен, что маринад нельзя использовать из-за некоторых объектов (из скрученной библиотеки). Спасибо за ссылку, я попробую взглянуть на нее как можно скорее. – Sylvain

+0

Наконец-то прошло некоторое время, чтобы посмотреть разговор. Было интересно. Однако я думаю, что это немного превышает мои простые потребности :-) – Sylvain

Смежные вопросы