验证从原子向量创建arrow Array是否会复制原向量
关于R对象转Arrow Array是否复制内存的问题解答
你的操作没有错误,这是arrow包的正常行为,原因如下:
内存机制差异
- 当你通过
arrow::Array$create(v)创建Arrow数组时,Arrow会将R原子向量v的数据复制到Arrow独立的内存管理空间中——Arrow拥有自己的内存池,和R的原生内存系统是分离的,不会直接复用R对象的内存。 - 调用
a$as_vector()将Arrow数组转回R向量时,需要把Arrow内存中的数据复制回R的内存空间,因此得到的d是一个全新的R对象,内存地址自然和原向量v不同。
从inspect输出看细节
观察d的.Internal(inspect())输出:
@0x00000248da541230 13 INTSXP g0c0 [REF(65535)] arrow::ChunkedArray<0x00000248dac3e2b0, int32, 1 chunks, 0 nulls> len=3
这里标注的arrow::ChunkedArray<...>说明这个R向量是Arrow的"代理对象",底层数据仍存在Arrow内存中;当你访问d[1]时,会按需将对应元素复制到R的临时内存对象,所以它的地址也和v[1]不同。
优化建议
如果想减少内存复制,建议直接使用Arrow的原生API操作Arrow数组(比如计算、筛选、聚合等),避免在R向量和Arrow数组之间频繁转换。
内容的提问来源于stack exchange,提问作者daniellga
相关产品推荐
相关产品推荐

