我需要一个快速的建议。我提到以下场景是基于我在 64 位上的 monetdblite 编译中已经可用的 c_api 的使用,目的是将它与一些即席 C 编写的函数一起使用。
简短:如何实现或模拟以下场景: 更新 aTable set a,b,c = func(x,y,z,...)
长。许多算法返回多个变量,例如多元回归。
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.更新aTable set dummy = func_compute(x,y,z,...)
其中 dummy 是一个临时的 __int64 字段,func_compute 将计算所有必要的输出并将结果存储到一个虚拟指针中。为了确保常量估计没有问题,数组中的第一个返回值将是真正的虚拟指针,其余的只是一个递增的 dummy + i 值;
2.更新aTable set 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 次(内存实际上没有被复制的任何机会?)。
有没有其他更好的方法来实现这一目标?