2015-12-18 2 views
3

У меня есть кадр данных, состоящий из Time Series.Параллельное программирование в pyRserve с использованием сельдерея

Индекс даты | Временная серия 1 | Временная серия 2 | ... и так далее

Я использовал pyRserve запустить функцию прогнозирования с помощью R.

Я хочу осуществить параллельную обработку с использованием сельдерея. Я написал код рабочего в следующем контексте.

def pipeR(k #input variable): 
    conn = pyRserve.connect(host = 'localhost', port = 6311) 
    # OPENING THE CONNECTION TO R 

    conn.r.i = k 
    # ASSIGNING THE PYTHON VARIABLE TO THAT OF IN THE R ENVIRONMENT 

    conn.voideval\(''' 
    WKR_Func <- forecst(a) 
    { 
    ...# FORECASTS THE TIMESERIES IN COLUMN a OF THE DATAFRAME 
    } 
    ''') 

    conn.eval('forecst(i)') 
    # CALLING THE FUNCTION IN R 

group(pipeR.s(k) for k in [...list of column headers...])() 

Для реализации параллельной обработки, можно иметь один порт для всех рабочих процессов (как я сделал в приведенном выше коде, порт: 6311) или я должен иметь различные порты для различных рабочих процессов ??

В настоящее время я получаю сообщение об ошибке

Ошибка в SocketConnection ("локальный", порт = порт, сервер = TRUE, блокирующие = TRUE,: не может открыть соединение

в R .

+0

выполняет команду 'conn = pyRserve.connect (host = 'localhost', port = 6311)' work, например. из ipython? – scytale

+0

Да, это должно быть ... Предоставлено u имеет R и установленный в нем пакет Rserve .... –

ответ

1

проблема решена, когда получил я открыл различные порты для каждого рабочего процесса ...

def pipeR(k, Frequency, Horizon, Split, wd_path): 
    # GENERATING A RANDOM PORT 
    port = randint(1000,9999) 

    # OPENING THE PORT IN THE R ENVIRONMENT 
    conn0 = pyRserve.connect(host = 'localhost', port = 6311) 
    conn0.r.port = port 
    conn0.voidEval\ 
    (''' 
     library(Rserve) 
     Rserve(port = port, args = '--no-save') 
    ''') 

    # OPENING THE PORT IN THE PYTHON ENVIRONMENT 
    conn = pyRserve.connect(host = 'localhost', port = port) 

    # ASSIGNING THE PYTHON VARIABLE TO THAT OF IN THE R ENVIRONMENT 
    conn.r.i = k 

    conn.voideval\ 
    (''' 
    WKR_Func <- forecst(a) 
    { 
    ...# FORECASTS THE TIMESERIES IN COLUMN a OF THE DATAFRAME 
    } 
    ''') 

    conn.eval/('forecst(i)') 
    conn0.close() 
+0

Я смотрю ваш ответ здесь и планирую сделать что-то подобное; есть ли случай, если у вас есть несколько соединений с 'conn0', что все они имеют одно и то же состояние в R? Я вижу в [Rserve docs] (http://www.rforge.net/Rserve/), что «у каждого подключения есть отдельное рабочее пространство и рабочий каталог».? – shapiromatron

+0

Думаю, что так. Документы говорят, что всякий поток должен иметь свой собственный объект соединения, если явно не явно. Следовательно, я пробовал вышеупомянутый подход. –

+0

Я только что проверил; не думайте, что это правда. Здесь я запускаю 1 экземпляр Rserve, и у меня есть два соединения в python; состояние не используется https://gist.github.com/shapiromatron/80a2547a599441332c736ff5d836097b – shapiromatron

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