обновить набор таблиц a, b, c = func (x, y, z,…) - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужен быстрый совет с практическими рекомендациями. Я упоминаю, что следующий сценарий основан на использовании c_api, уже доступном для моей компиляции monetdblite на 64-битной системе, и намерен использовать его с некоторыми написанными функциями adhoc C.

Коротко: как мне достичь или смоделировать следующий сценарий: обновить aTable set a, b, c = func (x, y, z,…)

Long. Многие алгоритмы возвращают более одной переменной, например, множественную регрессию.

bool m_regression(IN const double **data, IN const int cols, IN const int rows, OUT double *fit_values, OUT double *residuals, OUT double *std_residuals, OUT double &p_value);

Чтобы минимизировать передачу данных между monetdb и тяжелой вычислительной функцией, все эти результаты генерируются за один шаг. Вопрос в том, как я могу передать их обратно сразу, минимизируя время вычислений и трафик памяти между monetdb и внешней функцией C / C ++ (/ R / Python)?


Моя первая мысль, чтобы решить это что-то вроде этого:

1. обновить набор таблиц dummy = func_compute (x, y, z,…)

где dummy - это временное поле __int64, а func_compute вычислит все необходимые выходные данные и сохранит результат в фиктивном указателе. Чтобы убедиться, что с постоянной оценкой нет проблем, первое возвращаемое значение в массиве будет указателем реального фиктивного значения, а остальные - просто увеличенным значением dummy + i;

2. обновить набор таблиц a = func_ret (dummy, 1), b = func_ret (dummy, 2), c = func_ret (dummy, 3) [, dummy = func_free (dummy)];

Предполагая, что func_ret получит пустышку в том же порядке, в котором он был возвращен при первом вызове, я просто скопировал бы подготовленный результат в предоставленное хранилище; В случае, если порядок не сохранен, мне понадобится дополнительный шаг, чтобы получить минимум (реальный фиктивный указатель), а затем использовать смещение текущего значения для поиска в моем массиве.

__int64 real_dummy = __inputs[0][0];

double *my_pointer_data = (double *) (real_dummy + __inputs[1][0] * sizeof(double)* row_count);

memcpy(__outputs[0], my_pointer_data, sizeof(double)* row_count);

// или ============================

__int64 real_dummy = minimum(__inputs[0]);

double *my_pointer_data = (double *) (real_dummy + __inputs[0][1] * sizeof(double)* row_count);

for (int i=0;i<row_count;i++)
   __outputs[0][i] = my_pointer_data[__inputs[0][i] - real_dummy];

Менее важно, как я собираюсь освободить временную память, может быть в последнем операторе в обновлении или в новом фиктивном операторе обновления с использованием func_free. Проблема в том, что мне не кажется, что, даже если я сэкономлю некоторое вычислительное (большое) время, прохождение фиктивного файла все равно будет выполнено 3 раза (есть ли вероятность того, что память на самом деле не скопирована?).

Есть ли другой лучший способ добиться этого?

1 Ответ

0 голосов
/ 31 января 2019

Мне не известен хороший способ сделать это, извините. Вы можете извлечь таблицу, добавить столбцы в виде BAT любым удобным вам способом и записать их обратно.

...