在R中读取C++二进制文件

use*_*743 3 r rcpp

我可以在R中读取C++编写的二进制文件吗?

我一直在我的R包中使用Rcpp,模拟通常会生成大量数据.我打算用C++将输出写入二进制文件,然后在R中读取它.如果我作为文本文件写,但我没有找到二进制文件的解决方案.如果我使用许多NumericVector传递数据,程序有时会突然崩溃(我还没有完全理解使用Rcpp的内存管理).

这种方法能否让我在C++和R之间共享更大的数据集,而不是传递向量的数据集?在C++中,最大向量大小受RAM和地址总线的限制(可能是?)但我认为R能够使用swap加载更大的向量.我是否纠正或误解了这些概念?

Dir*_*tel 5

是的你可以.但它"复杂".

您正在着手一个名为二进制序列化的主题.那里有很多工作要做.从本质上讲,你处于两者之间的连续性中

  • minimal:打开一个文件,写出N个二进制项; 然后在另一边读N个二进制文件.我们在几年前做了类似的工作,用一些元数据写了一些元数据<rows,cols,version>然后用二进制blob rows * cols连接到矩阵

  • maximal:使用完全描述性的元语言,如Protocol Buffer或MessagePack来描述二进制内容,用C++编写(使用适当的库)并在R中读回(使用相应的包---我参与其中一个: RProtoBuf和RcppMsgPack).

介于两者之间.如果你真的只需要在C(++)和R之间进行通信,你可以尝试RData/rds格式.有一个库: librdata和我进行了实验(并提交了一些错误报告并提出了一些拉取请求).我可能会从那里开始.

所以简而言之:做一些研究,弄清楚要做什么,然后做:)

PS如果您通过Rcpp从R调用C++,那么您可能不需要文件.我们可以来回传递大对象 - 限制可能是你的RAM.

  • 仔细调试.如果你指定给`Rcpp :: NumericMatrix`,那么就不会复制.另见[刚才出版的关于RcppMsgPack的论文](https://journal.r-project.org/archive/2018/RJ-2018-068/index.html). (2认同)