Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R->;kdb:将R数据传递给kdb+;作为二进制对象_R_Ipc_Kdb - Fatal编程技术网

R->;kdb:将R数据传递给kdb+;作为二进制对象

R->;kdb:将R数据传递给kdb+;作为二进制对象,r,ipc,kdb,R,Ipc,Kdb,将R对象(更具体地说,时间序列表示为xts或data.table对象,即基于时间的列和数字列)插入kdb+数据库的最有效方法是什么 我能够通过所述的q表达式找到唯一涉及字符串序列化的解决方案。从R与kdb交互的最“稳定”的方法是使用字符串查询接口。如果您想要实际的对象[反]序列化,那么建议您查看C接口,并从R调用该库以与KDB交互。我的解决方案就是从这个版本的 Yang添加了两个函数:convert_binary,convert_r,即反序列化数据,这基本上就是您所要求的。但是,返回值是十六进

R
对象(更具体地说,时间序列表示为
xts
data.table
对象,即基于时间的列和数字列)插入
kdb+
数据库的最有效方法是什么


我能够通过所述的
q
表达式找到唯一涉及字符串序列化的解决方案。

从R与kdb交互的最“稳定”的方法是使用字符串查询接口。如果您想要实际的对象[反]序列化,那么建议您查看C接口,并从R调用该库以与KDB交互。

我的解决方案就是从这个版本的

Yang添加了两个函数:convert_binary,convert_r,即反序列化数据,这基本上就是您所要求的。但是,返回值是十六进制数组。要与现有的execute函数合并,我们需要使用paste(collapse=“”)将其转换为字符串,然后使用sprintf执行。以下是将R中的robj发送到kdb中的d的示例:

execute(h, sprintf("d:-9!0x%s",paste(convert_r(robj),collapse="")))
问题是,如果数组较大,则粘贴(collapse=“”)需要相当长的时间

robj是r对象。e、 g.我用data.frame(尺寸=60000x100)试过了。convert_r()转换时间<0.5s;粘贴(collapse=“”)需要13秒才能转换为单个字符串,然后执行(h,…)需要<1秒才能传输数据

我还没有发现有人编写过通过序列化二进制数据向kdb发送R数据的函数(我不知道为什么),所以我自己做了一个。代码如下:

SEXP kx_r_send_data(SEXP connection, SEXP robj, SEXP varname)
{
  K result, conversion, serialized;
  kx_connection = INTEGER_VALUE(connection);
  conversion = from_any_robject(robj);
  serialized = b9(2, conversion);
  result = k(kx_connection, "{[d;v] v set -9!d;}", r1(serialized), ks((S)CHARACTER_VALUE(varname)), (K)0);
  SEXP s = from_any_kobject(result);
  r0(result);
  r0(conversion);
  r0(serialized);
  return s;
}
我假设您知道如何修改qserver.c并重新编译qserver.o 然后在qserver.R中添加一个函数:

send_data <- function(connection, r_obj, varname) {
  .Call("kx_r_send_data", as.integer(connection), r_obj, varname)
}

send_数据感谢您的洞察力。考虑到我不熟悉C,并且公共领域中不存在这样的R/Rcpp包装器,社区中有人对发布这样的R包感兴趣吗?即使在经济上我也会支持这一点。我也不支持,否则我会主动提出:)这里有一些关于将libs加载到R中的信息,我的一位同事以前做得非常成功:。只有当您从kdb提取数据,而不是将大数据插入kdb时,使用字符串查询接口才是好的。我上面提供的是用于插入的。另一种方法是设置Rserver,然后从Rserver中提取kdb端的数据。但这是我试图避免的另一层设置。我的代码有两个参数。1.(S) 字符_值(varname),将“varname”转换为SEXP类型字符,2。(K) 0,将整数作为K对象重新运行。另外,“S”类型是大写的,它是SEXP类型,也就是说,您需要包括“rserver.c”和“qserver.c”才能工作。查看“来自github的qserver.c”中的base.c,了解如何设置要编译的环境。对于你的k括号,你能检查一下@statquant代码中是否有输入错误吗