我可以在R中读取C ++编写的二进制文件吗?
我在我的R包中一直使用Rcpp,而模拟通常会生成大量数据。我打算将输出写入C ++的二进制文件中,然后再用R读取。如果我以文本文件的形式写入,但找不到二进制文件的解决方案,则此方法有效。如果我使用许多NumericVectors传递数据,程序有时会突然崩溃(我尚未完全了解使用Rcpp进行的内存管理)。
与传递矢量相比,这种方法能否使我在C ++和R之间共享更大的数据集?在C ++中,最大向量大小受RAM和地址总线(可能是?)限制,但我认为R能够使用swap加载更大的向量。我是正确的还是误解了这些概念?
答案 0 :(得分:5)
可以。但这很“复杂”。
您正在着手一个名为二进制序列化的主题。这里有很多工作。本质上,您处于
之间的连续体中最小:打开一个文件,写出N个二进制项;然后在另一侧读取N个二进制文件。几年前,我们做过类似的工作,先用<rows,cols,version>
写了一些元数据,然后用rows * cols
double的二进制blob附加到矩阵上
最大:使用协议Buffer或MessagePack之类的完全描述性元语言来描述二进制内容,以C ++编写(使用适当的库),并以R形式读回(使用相应的软件包--- I)都涉及一个:RProtoBuf和RcppMsgPack)。
介于两者之间。如果您真的只需要在C(++)和R之间进行通信,则可以尝试使用RData / rds格式。有一个库:librdata,我进行了实验(并提交了一些错误报告并提出了一些拉取请求)。我可能从这里开始。
因此,简而言之:做一些研究,弄清楚该怎么做,然后再做:)
PS如果您从R通过Rcpp调用C ++,则可能不需要文件。我们可以来回传递大型对象-限制可能是您的RAM。