Как я могу передать данные от Perl до Java?

Вы можете использовать векторизованное решение - создать булеву маску отдельно, объединить в цепочку по & и установить значения в numpy.where :

x = df['EOG_start_farm'].values-df['EOG_Min_Farm'].values
m1 = (df['EOG_Start_model'].values-df['EOG_Min_model'].values) < x
m2 = (df['EOG_Max_model'].values-df['EOG_Min_model'].values) < x
m3 = df['Avg'].values > 2
m23 = m2 & m3

df['EOG_flag'] = np.where(m1 & m2 & m3, 1, df['EOG_flag'].values)
df['Gust_flag'] = np.where(m2 & m3, 1, df['Gust_flag'].values)

Производительность :

np.random.seed(2019)

N = 6000
c = ['EOG_Start_model','EOG_Min_model','EOG_start_farm','EOG_Min_Farm','EOG_Max_model',
     'EOG_Max_Farm','Avg','EOG_flag','Gust_flag']
df = pd.DataFrame(np.random.rand(N, 9), columns=c)
print (df)

In [91]: %%timeit
    ...: x = df['EOG_start_farm'].values-df['EOG_Min_Farm'].values
    ...: m1 = (df['EOG_Start_model'].values-df['EOG_Min_model'].values) < x
    ...: m2 = (df['EOG_Max_model'].values-df['EOG_Min_model'].values) < x
    ...: m3 = df['Avg'].values > 2
    ...: m23 = m2 & m3
    ...: 
    ...: df['EOG_flag'] = np.where(m1 & m2 & m3, 1, df['EOG_flag'].values)
    ...: df['Gust_flag'] = np.where(m2 & m3, 1, df['Gust_flag'].values)
    ...: 
597 µs ± 6.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [93]: %%timeit
    ...: for i in range(len(df)):
    ...:     if ((df['EOG_Start_model'].values[i]-df['EOG_Min_model'].values[i])<(df['EOG_start_farm'].values[i]-df['EOG_Min_Farm'].values[i])) &((df['EOG_Max_model'].values[i]-df['EOG_Min_model'].values[i])<(df['EOG_Max_Farm'].values[i]-df['EOG_Min_Farm'].values[i]))&((df['Avg'].values[i]>2)):
    ...:           #print('EOG')
    ...:           df['EOG_flag'].values[i]=1
    ...: 
    ...:     if ((df['EOG_Max_model'].values[i]-df['EOG_Min_model'].values[i])<(df['EOG_Max_Farm'].values[i]-df['EOG_Min_Farm'].values[i]))&((df['Avg'].values[i]>2)):
    ...:             #print('gust')
    ...:             df['Gust_flag'].values[i]=1
231 ms ± 1.16 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

5
задан Community 23 May 2017 в 12:26
поделиться

5 ответов

Если бы производительность важна, я рекомендовал бы иметь персистентное выполнение процесса Perl. При запуске интерпретатора Perl каждый раз, когда Вы хотите выполнить свой код, будет вполне издержками.

Самый легкий способ связаться состоит в том, чтобы процесс Java открыл соединение TCP для процесса Perl, запишите некоторые данные и верните некоторых.

Формат, который Вы используете для отправки данных в от процесса Perl назад к Java, каждый будет зависеть от того, что Вы отправляете и как универсальный и допускающий повторное использование Вы хотите, чтобы Ваш код был. Передача обратно, которую строки XML будут хорошими и универсальными, но передающими обратно массивами байтов, созданными с пакетом в Perl и затем читать с DataInputStream в Java, будет очень, намного быстрее.

5
ответ дан 13 December 2019 в 05:43
поделиться

Встроенный:: Java. Это работает действительно хорошо, после того как Вы будите его и выполнение. Я работал над проектом несколько лет назад, который имел веб-приложение Perl, говорящее с Java сервер SOAP для некоторой связи в режиме реального времени, и это было просто слишком медленно. Мы заменили его системой с помощью Встроенного:: Java для коммуникации и это было намного быстрее. Определенно минимизируйте точки, что Вы передаете объекты назад и вперед и пытаетесь сделать те объекты простыми (мы придерживались строк, чисел и массивов) помешать вещам выйти из-под контроля также. Но я - определенно преобразование!

2
ответ дан 13 December 2019 в 05:43
поделиться

JSON является легким, легким форматом для того, чтобы раздать данные.

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

3
ответ дан 13 December 2019 в 05:43
поделиться

если у Вас уже есть XML, Ваш наилучший вариант состоит в том, чтобы, вероятно, продолжить использовать его.

2
ответ дан 13 December 2019 в 05:43
поделиться

Я также нахожу это странным, что Ваш код жемчуга для парсинга XML был бы значительно быстрее, чем эквивалентный код в Java. Даже если бы это, тем не менее, я не могу предположить, что это когда-либо было бы быстрее, чем издержки, понесенные IPC. Даже при использовании персистентного процесса жемчуга Вы все еще оказываетесь перед необходимостью отправлять ему данные, по-видимому, по сокету, затем возвращать некоторые данные и наконец десериализовывать его во что-то применимое.

Вы попытались улучшить производительность своего XML, анализирующего в Java? При использовании DOM или сторонней библиотеки как JDOM или солонка попытайтесь использовать SAX вместо этого. Или возможно просто использование регулярных выражений вместо того, чтобы анализировать XML было бы быстрее (jwz, несмотря на это).

В любом случае я рекомендовал бы использовать профилировщика с Вашим кодом Java сначала, чтобы видеть, может ли он быть улучшен.

0
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

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