Каков наилучший способ постоянного хранения HTTP-ответов для использования в приложении веб-скрейпинга?

Я ищу хранилище ключей/значений в python, которое подходит для хранения (и кэширования) ответов HTTP (контент, заголовки HTTP, отметка времени), заданных URL-адресом запроса. Приложение представляет собой механизм веб-скрейпинга, в котором регулярно запрашиваются несколько сайтов. Затем набор процедур анализирует очищенные данные.

Варианты, которые я исследовал до сих пор, включают:

  • модуль полки python (быстрый, но данные не могут быть распределены, запись только одним процессом)

  • mongodb (относительно быстрый, пока что лучше всего подходит для того, что я ищу)

  • CouchDB (слишком медленный для этого приложения)

  • memcached (не подходит, потому что хранилище не является постоянным, а кэшированные данные не могут быть реплицированы, поправьте меня, если я ошибаюсь)

Некоторые результаты производительности с использованием реальных очищенных данных:

python shelve:           3500 reads/second
couchdb (couchdbkit):      33 reads/second
mongodb (pymongo):       2300 reads/second
redis:                   1200 reads/second                   

person Ivo Bosticky    schedule 19.12.2011    source источник
comment
Пробовали ли вы redis?   -  person jcollado    schedule 19.12.2011
comment
Если вы рассматривали memcached или Redis, вы должны объяснить, почему они не участвуют в конкурсе. Если вы еще не смотрели в этом направлении, проверьте их.   -  person Barry Wark    schedule 19.12.2011
comment
MongoDB работает быстро, но, учитывая его природу, memcached и, в меньшей степени, Redis должны быть быстрее. CouchDB кажется в лучшем случае неоптимальным для этого (каждый запрос в основном представляет собой m/r)   -  person Remon van Vliet    schedule 19.12.2011
comment
Как вы храните URL-адрес в mongodb? Если это ваш ключ, вы должны индексировать его, но индексирование длинных строк может быть медленным или вообще не работать, если они слишком длинные. Вам нужно иметь возможность перечислять ключи или можно использовать хеширование?   -  person mnemosyn    schedule 20.12.2011
comment
Я не добавил memcached, потому что ищу постоянное и распределенное хранилище, что означает, что хранилище должно пережить перезагрузку без потери каких-либо данных, а кэшированные записи на одном узле должны быть реплицированы на другие узлы.   -  person Ivo Bosticky    schedule 20.12.2011
comment
В mongodb, поскольку URL-адрес является естественным первичным неизменным и уникальным ключом, я сохранил его в поле _id, которое автоматически индексируется.   -  person Ivo Bosticky    schedule 20.12.2011
comment
Я думаю, вы также должны проверить количество записей в секунду.   -  person lig    schedule 20.12.2011


Ответы (1)


В итоге я использовал закрытую коллекцию в mongodb. Каждая запись содержит URL-адрес (первичный ключ), содержимое и заголовки. Поскольку ограниченные коллекции не допускают удаления, для содержимого устанавливается значение Null, чтобы указать, что кэшированная запись была удалена.

person Ivo Bosticky    schedule 03.05.2012