Найдите эффективный способ интеграции разных языковых библиотек в один проект, используя Python в качестве «клея» - PullRequest
7 голосов
/ 07 августа 2011

Я собираюсь принять участие в проекте, связанном с НЛП, и мне нужно использовать различные библиотеки.Некоторые из них на Java, другие на C / C ++ (для задач, требующих большей скорости) и, наконец, некоторые на Python.Я думал об использовании Python в качестве «клея» и создавал классы-обертки для каждой задачи, которую я хочу выполнить, опираясь на другой язык.Для этого, например, класс-оболочка должен выполнить программу Java и связаться с ней, используя каналы.Мои вопросы:

  1. Как вы думаете, это сработало бы для ресурсоемких и очень повторяющихся задач?Или издержки, добавленные конвейерной связью, будут слишком тяжелыми?

  2. Есть ли какая-либо другая (предпочтительно простая) архитектура, которую вы бы предложили?

Ответы [ 5 ]

5 голосов
/ 07 августа 2011

Я бы просто посоветовал не делать этого.

Не реализуйте вещи в C / C ++ "для скорости". Выигрыш в производительности не , вероятно, будет таким же большим, как вы ожидаете; например по сравнению с реализацией в Java с использованием лучших методов проектирования и методов повышения производительности.

Не пытайтесь склеивать много языков вместе. Вы настраиваете себя на множество проблем переносимости, трудностей в отладке и проблем надежности; например из-за ошибок C / C ++, приводящих к сбою JVM. Кроме того, существуют проблемы с производительностью при соединении между языками, и могут возникнуть непредвиденные узкие места. (Например, вы можете обнаружить, что ваш C / C ++ должен быть запущен однопоточным из-за проблем с многопоточностью, и поэтому вы не можете воспользоваться преимуществами многопоточности Java в типичной многоядерной системе.)

Вместо этого я советую вам искать библиотеки, которые позволят вам реализовать все приложение на одном языке. Если это невозможно, спроектируйте его так, чтобы разные языковые компоненты представляли собой разные исполняемые файлы / процессы, взаимодействующие через какой-либо RPC, обмен сообщениями или что-то еще.

1 голос
/ 07 августа 2011

Вам стоит взглянуть на Apache UIMA .Он предназначен именно для этого.С веб-сайта проекта:

Frameworks запускают компоненты и доступны как для Java, так и для C ++.Java Framework поддерживает запуск компонентов Java и не Java (с использованием инфраструктуры C ++).Инфраструктура C ++, помимо поддержки аннотаторов, написанных на C / C ++, также поддерживает аннотаторы Perl, Python и TCL.

UIMA может управлять каналами и аннотаторами и построена в масштабе.

1 голос
/ 07 августа 2011

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

Вы, вероятно, можете автоматически обернуть код C / C ++ с помощью Python ( SWIG , ctypesgen , Boost.Python ), так что единственным надо написать самому, тогда бы разговаривал с Java.

Вы также можете сделать это по-другому - запустить код Python в JVM с помощью Jython , чтобы код Python и Java были вместе, а затем поговорить с C / C ++ оттуда.

0 голосов
/ 08 августа 2011

1) Считаете ли вы, что это сработает для ресурсоемких и очень повторяющихся задач? Или издержки, добавленные трубной связью, будут слишком тяжелыми?

Зависит от вашей задачи. Если это типичное приложение NLP, в котором загружена большая модель в память и вы передаете только относительно небольшие фрагменты данных (строки, последовательности меток / разбор деревьев), это может сработать. Тем не менее, трудно установить правильную конвейерную связь, так как вам нужно решить множество проблем с буферизацией и синхронизацией. Python - очень хороший клейкий язык, но он не решает все проблемы.

2) Есть ли другая (желательно простая) архитектура, которую вы бы предложили?

Предоставляйте сервисы компонентов NLP и подключайтесь к ним через интерфейсы REST. Есть готовые инструменты, которые делают это, например, CLAM . Pyro и SPIRO делают связь между Java и Python еще более прямой и может быть проще в использовании, чем HTTP / REST (но YMMV).

Части, написанные на C / C ++, также можно интегрировать с CPython, используя Cython . Не начинайте реализовывать вещи в C или C ++, потому что вы думаете что они будут быстрее; вы также можете сначала реализовать их в Python, а затем посмотреть, сможете ли вы добиться желаемой производительности с помощью NumPy и / или Cython.

0 голосов
/ 07 августа 2011

Я бы посмотрел на Jepp или JPype вместо использования IPC для этого.Я бы избегал Jython, поскольку загрузка библиотек C / C ++ в Java, вероятно, будет сложнее, чем в CPython.

...