更新aTable集a,b,c = func(x,y,z,...)

时间:2018-11-15 11:45:35

标签: c-api monetdblite

我需要快速的建议。我提到以下情况是基于对我的64位monetdblite编译中已经可用的c_api的使用,目的是将其与某些即席C编写的函数一起使用。

简短:我如何实现或模拟以下情况: 更新表集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将计算所有必需的输出并将结果存储到哑指针中。为了确保常量估计没有问题,数组中第一个返回的值将是真实的虚拟指针,其余的只是虚拟+ 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];

我要如何释放临时内存的相关性较小,可以在update的最后一条语句中,也可以使用func_free在新的伪造更新语句中。  问题是,即使我节省了一些计算(大量)时间,我也不希望虚拟对象的传递仍然完成3次(是否真的没有复制内存?)。

还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:0)

抱歉,我不知道这样做的好方法。您可以检索表,以任意方式将列添加为BAT并将其写回。