2012-06-07 2 views
2

Я посмотрел высоко и низко для этого ответа, поэтому я прибегал к публикации здесь. Есть ли какое-либо ожидание какой-либо заметной задержки, если у меня есть программа на Linux C++, вызовите R-скрипт/функцию с чем-то вроде RCpp? Будет ли это ожидаться или даже разумным? Что делать, если я использую что-то вроде RCaller из Java JAR-файла? Считаете ли вы, что C++ по-прежнему быстрее, чем Java, если он вызывает тот же скрипт/функцию R? Любые ожидаемые различия? СпасибоБенчмаркинг RCPP или RCaller сценариев C++ или Java, вызывающих R?

ответ

1

Я думаю, вы хотите RInside, что делает его очень простым встраивание R в ваше приложение на C++. Он поставляется с многочисленными примерами в четырех каталогах, в том числе для использования с Qt, Wt (для webapps) и MPI.

В этом контексте вы запускаете R один раз при запуске, а затем имеете свой собственный экземпляр. Задержка в оба конца будет зависеть от того, сколько времени вам потребуется, чтобы отправить команду экземпляру R, плюс, однако, длительность R (которая вполне может доминировать) плюс возврат.

RInside использует Rcpp, поэтому вы получаете передачу всего объекта и все остальные тонкости. Взгляните на пример RInside и опубликуйте вопросы в списке rcpp-devel.

1

У меня нет специальных знаний о интерфейсе внешней функции R или RCpp, но они работали с несколькими другими. На ваши вопросы нельзя ответить с уверенностью. Есть только некоторые эмпирические правила. Работа FFI заключается в том, чтобы удовлетворять предположениям как вызывающей, так и вызываемой среды. Обычно это касается соответствия макетов данных обоих языков путем копирования из одного в другое. (Это то, о чем говорит RCpp.) Или вам может быть очень повезло и они совпадают. Если среда выполнения аналогична или данные перемещаются по границе между языками, это может быть очень эффективным: не намного дороже, чем вызов самообслуживания. По этой причине звонок из Фортрана очень часто происходит очень быстро. Если среда сильно отличается, необходимо скопировать большие структуры данных. Копии потребляют ресурсы: память и процессорные циклы. Сбор мусора - это ребенок-плакат для различий между средами: отдельные коллекционеры будут редко (читать никогда) сотрудничать. R и Java (оба сборщика мусора), вероятно, потребуют копирования по этой причине. Если вы пишете C++ специально для calL R, вы можете настроить свои данные в структурах RCpp, чтобы копии не нужны.

Я бы написал несколько небольших тестов, начиная с C++, которые имитируют объем данных, которые вы должны перемещать через интерфейс. Запустите и запустите их, чтобы получить накладные расходы. Из этого вы можете принимать реальные решения.

+0

Хороший ответ Джин. Большое спасибо за накопление данных в C++ и использование R. Здесь моя проблема может быть с задержкой. С сборщиком мусора Java это также может представлять серьезную проблему, поскольку я никогда не занимался этим, поэтому, возможно, C++ - более разумный выбор. –

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