我需要一个快速的建议。我提到以下场景是基于我在64位上的monetdblite编译已经可用的c_api的使用,目的是将其与一些特定的c编写的函数一起使用。
Short:我如何实现或模拟以下场景:更新a表集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.更新表集dummy=func_compute(x,y,z,…(
其中dummy是一个临时__int64字段,func_compute将计算所有必要的输出,并将结果存储到一个dummy指针中。为了确保常数估计没有问题,数组中的第一个返回值将是真正的伪指针,其余的只是一个递增的dumm+i值;
2.更新aTable集合a=func_ret(dummy,1
假设func_ret将按照第一次调用时返回的顺序获得dummy,我只需将准备好的结果复制到提供的存储中;如果顺序没有保留,我将需要额外的步骤来获得最小值(真正的伪指针(,然后使用当前值的偏移量在数组中查找。
__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的新的伪update语句中。问题是,在我看来,即使我节省了一些计算(大量(时间,假人的传递仍然会完成3次(内存实际上没有被复制的可能性吗?(。
还有其他更好的方法可以实现这一点吗?
对不起,我不知道有什么好方法可以做到这一点。您可以检索该表,以任何您喜欢的方式将列添加为BAT,然后将其写回。