Библиотека кеширования Perl для больших наборов данных? - PullRequest
2 голосов
/ 22 ноября 2011

Я ищу библиотеку Perl для обработки кэширования запросов к БД, но она должна обрабатывать гораздо больший кэш, чем обычное приложение. Для этого необходимо:

  1. кешируется около 200 000 записей одновременно, в среднем около двух МБ или около того (итого, общий размер кэша около 400 ГБ)

  2. не имеют максимального размера записи (или, по крайней мере, достаточно большого, например, несколько ГБ)

  3. учитывает размер, поэтому он автоматически удаляет самые старые (с точки зрения времени последнего доступа) записи, когда общий объем памяти превышает предварительно установленный максимум

  4. будь как можно быстрее с учетом вышеуказанных требований

Библиотеки, на которые я смотрел, это CHI и Cache :: SizeAwareFileCache (расширение Cache :: Cache).

Основная проблема, с которой я столкнулся с CHI, заключается в том, что мне нужно было бы использовать CHI :: Driver :: File с включенным is_size_aware, но документация специально предупреждает об этом:

... для драйверов, которые не могут атомарно считывать и обновлять значение - например, CHI :: Driver :: File - при обновлении размера возникает условие гонки, которое может привести к тому, что размер со временем станет неточным.

Основная проблема, с которой я столкнулся с Cache :: SizeAwareFileCache, заключается в том, что Cache :: Cache является старым и в настоящее время не поддерживается. Первое, что я вижу в документации, - это раздел, который советует мне использовать вместо этого CHI.

Есть какие-нибудь рекомендации? Должен ли я использовать одну из этих двух библиотек или что-то еще? Я схожу с ума от желания использовать кеширование для этого вообще? У кого-нибудь есть опыт работы с подобными требованиями? Буду благодарен за любой совет.

Некоторые сведения о приложении:

У меня есть приложение, которое анализирует большие веб-сайты, чтобы найти трудно обнаруживаемые ошибки / неэффективность в коде HTML, часто скрываемые среди сотен тысяч страниц. Приложение сканирует весь веб-сайт и сохраняет HTML-код каждой страницы в БД. (сервер MySQL, работающий на отдельном компьютере) После завершения сканирования пользователь может запускать различные программные инструменты для анализа HTML каждой страницы на сайте.

Инструменты ждут в очереди и запускаются по одному. Каждый инструмент должен загружать HTML каждой страницы в обходе, всегда в том же порядке. Таким образом, если сканирование захватило 100 000 страниц, и пользователю необходимо запустить на нем 15 различных инструментов, то в кеше должно быть не менее 100 000 записей, каждая из которых будет прочитана 15 раз. Очень важно, чтобы в кеше можно было хранить все страницы данного сайта одновременно. (в противном случае каждая страница будет отброшена, а затем повторно кэширована для каждого инструмента, что будет хуже, чем вообще отсутствие кэширования)

Самая большая цель - уменьшить нагрузку на базу данных. Вторичная (но все же очень важная) цель - повысить скорость.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Perl лучше работает с файлами, чем с БД. Если у вас есть 400 ГБ HTML-код внутри 200 000 страниц (т.е. примерно 2 МБ на файл HTML), вместо того, чтобы помещать 400 ГБ данные в БД, снова читайте в кэш (в конечном итоге снова записывайте на диск), почему бы не HTML-контент на диске и запись БД только ссылки с путем к файлу?

Имея все больше и больше «страниц» и «инструментов» для проведения анализа, вы можете захотеть иметь больше анализирующих машин. Нельзя синхронизировать 400 ГБ БД после кэширования. Сохраняйте размер БД небольшим и эффективным, и дублируйте файлы на локальный диск каждой анализирующей машины для прямого доступа (максимально быстрый). Для разных инструментов, которые не имеют зависимости и обновляют разные поля в записи БД, они могут работать одновременно. Для инструментов с зависимостями - ваш рабочий процесс.

1 голос
/ 22 ноября 2011

Вместо использования модуля, который реализует кеширование самостоятельно, я бы предложил использовать что-то вроде Memcached . А затем используйте одну из привязок Perl, например Cache :: Memcached , CHI :: Driver :: Memcached , Memcached :: Client или, возможно, другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...