RAWSXP是一个存储blob的好主意吗?

时间:2011-10-20 10:35:39

标签: r

我基本上有两个C函数可供R使用,其中一个是制作一些blob,第二个需要使用它。虽然用户不应该查看它,但我认为不对R类型进行任何序列化/转换并将其转储到RAWSXP是合理的。

这有什么不明显的缺点(即打印时杀死用户的控制台除外)?

编辑:好的,比方说我有一个double / int64 /(4 x int16)联合数组,这是一些算法的结果;我希望它具有正常的R复制语义,从用户的角度自然地表现(因此外部指针不是一个选项)但我不太急于将它序列化为R对象,因为它不会直截了当可能会以巨大的内存开销结束。

2 个答案:

答案 0 :(得分:4)

如果blob要在单个R会话中持续存在,那么在C级别创建外部指针并将其返回给用户会更自然。这在编写R扩展section 5.13中列出。

此方法的一个限制是外部指针不会序列化,因此不会保存到磁盘或例如从并行作业返回。当blob是对数据结构的引用时,这通常是合适的,该数据结构仅在创建它的上下文中有意义(例如,文件句柄),但如果它是静态数据结构则更少。在这种情况下,将数据存储为RAWSXP可能是合适的,通常作为具有打印/显示方法的S3或S4类的插槽或元素,以隐藏用户的血腥细节。也许缺点是RAWSXP由R分配和管理,例如,受垃圾收集,而外部指针的内容可能更直接地通过CallocFree分配。

答案 1 :(得分:1)

正如Martin和Josh指出的那样,外部指针可能更可取。

您的方法听起来与例如bigmemory做:它分配一块内存 put的R 并控制它,从而绕过R的内存管理和约束。对于您的目的而言,bigmemory使用它将内存作为自定义数据类型传递回R并不重要 - 外部指针使这成为可能。使用外部指针的其他包是 RODBC用于数据库连接对象,我的RcppDE包执行DEoptim但在C ++中执行的操作,从而允许用户提供的编译函数用于优化,利用Rcpp外部指针包装器:Rcpp::XPtr类。

正如马丁正确地说的那样,这一切都在好的手册中。