0

我需要一个快速的建议。我提到以下场景是基于我在 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 次(内存实际上没有被复制的任何机会?)。

有没有其他更好的方法来实现这一目标?

4

1 回答 1

0

我不知道这样做的好方法,对不起。您可以检索表,以任何您喜欢的方式将列添加为 BAT,然后将其写回。

于 2019-01-31T07:57:22.280 回答