Рекомендации по использованию инструмента для пауков с Lucene или Solr? [закрыто]

Что вы используете, это глобальная блокировка интерпретатора python. GIL позволяет только один поток запускать в интерпретаторе python.

Одним из преимуществ Boost.Python является то, что вы можете освободить GIL, сделать C ++, а затем вернуть его, когда закончите. Это также несет ответственность. Python обычно выпускает GIL через регулярные промежутки времени, чтобы дать другим потокам возможность запускать. Если вы находитесь на C ++, это ваша работа. Если вы продолжаете хруст в течение 2 часов, удерживая GIL, вы заморозите весь интерпретатор.

Это можно легко исправить с помощью небольшого обратного RAII:

class releaseGIL{
public:
    inline releaseGIL(){
        save_state = PyEval_SaveThread();
    }

    inline ~releaseGIL(){
        PyEval_RestoreThread(save_state);
    }
private:
    PyThreadState *save_state;
};

Теперь вы можете изменить свой код так:

class Foo{
public:
    Foo(){}
    void run(){
        {
            releaseGIL unlock = releaseGIL();
            int seconds = 2;
            clock_t endwait;
            endwait = clock () + seconds * CLOCKS_PER_SEC ;
            while (clock() < endwait) {}
        }
    }   
};

ОЧЕНЬ важно отметить, что вы НЕ ДОЛЖНЫ касаться какого-либо кода на основе питона или данных python или обращаться к интерпретатору, не удерживая GIL. Это приведет к сбою вашего интерпретатора.

Также можно пойти в другую сторону. Нить, в настоящее время не содержащая GIL, может получить ее и выполнить вызовы на python. Это может быть поток, который ранее выпускал GIL, или тот, который начинался на c ++ и никогда не имел GIL. Вот для этого класс RAII:

class AcquireGIL 
{
public:
    inline AcquireGIL(){
        state = PyGILState_Ensure();
    }

    inline ~AcquireGIL(){
        PyGILState_Release(state);
    }
private:
    PyGILState_STATE state;
};

Использование осталось в качестве упражнения для ученика.

Дополнительная заметка (я всегда забываю упомянуть об этом):

Если вы собираетесь возиться с GIL в c ++, ваше определение модуля должно начинаться с этого кода:

BOOST_PYTHON_MODULE(ModuleName)
{
    PyEval_InitThreads();

    ...
}
16
задан BuddyJoe 12 November 2008 в 00:50
поделиться

6 ответов

По-моему, это - довольно значительная дыра, которая подавляет широко распространенное принятие Solr. Новый DataImportHandler является хорошим первым шагом для импорта структурированных данных, но нет хорошего конвейера приема пищи документа для Solr. Nutch действительно работает, но интеграция между поисковым роботом Nutch и Solr несколько неуклюжа.
я попробовал каждый поисковый робот с открытым исходным кодом, который я могу найти, и ни один из них не интегрирует out-of-the-box с Solr.
Следят за OpenPipeline и Apache Tika.

11
ответ дан Geordie 12 November 2008 в 00:50
поделиться
  • 1
    И в этом случае выполняемая операция является существенно соединением. Это - семантическое значение этого кода, таким образом, это имеет большую часть смысла использовать тот точный оператор вместо того, чтобы использовать Where для реализации собственного Join. Join делает лучше задание передачи значения читателю в результате. – Servy 2 April 2013 в 20:34

Также проверьте Droid Apache [ http://incubator.apache.org/droids/] - это надеется не быть простой платформой паука/поискового робота/рабочего.

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

4
ответ дан 12 November 2008 в 00:50
поделиться

Nutch мог бы быть Вашим самым близким соответствием, но это не слишком гибко.

, Если Вам нужно что-то больше, что необходимо будет в значительной степени взломать собственный поисковый робот. Это не настолько плохо, как это звучит, каждый язык имеет веб-библиотеки, таким образом, просто необходимо соединить некоторый диспетчер очереди задачи с загрузчиком HTTP и синтаксический анализатор HTML, это не действительно так много работы. Можно, скорее всего, сойти с рук единственное поле, поскольку проверка является главным образом пропускной-способностью-intentive, не интенсивной ЦП.

2
ответ дан taw 12 November 2008 в 00:50
поделиться
  • 1
    Кажется, что этот подход работает, но все еще в docs я заканчиваю тем, что имел поля как _id который я don' t хотят иметь. – Masiar 4 March 2012 в 10:22

Я предлагаю, чтобы Вы проверили Nutch для получения некоторого вдохновения:

Nutch является программным обеспечением веб-поиска с открытым исходным кодом. Это основывается на Java Lucene, добавляя веб-специфические особенности, такие как поисковый робот, база данных графика ссылки, синтаксические анализаторы для HTML и других форматов документов, и т.д.

4
ответ дан lbz 12 November 2008 в 00:50
поделиться

Я попробовал Nutch, но было очень сложно интегрироваться с Solr. Я бы посмотрел на Heritrix. Он имеет обширную систему плагинов, облегчающую интеграцию с Solr, и намного быстрее при сканировании. Он широко использует потоки для ускорения процесса.

6
ответ дан 30 November 2019 в 21:03
поделиться

Кто-нибудь пробовал Xapian? Он выглядит намного быстрее, чем solr и написан на c ++.

0
ответ дан 30 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: