Мне нужен быстрый совет с практическими рекомендациями. Я упоминаю, что следующий сценарий основан на использовании 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 раза (есть ли вероятность того, что память на самом деле не скопирована?).
Есть ли другой лучший способ добиться этого?