R语言 检查从原子向量创建的箭头数组是否复制了该向量

bnl4lu3b  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(146)

我试着检查从一个r对象创建一个箭头数组是否会创建一个副本。我创建了一个数组,然后从那个数组创建了一个原子向量,但是内存地址似乎不一样......是不是我做错了什么?

> library(arrow)
> v = c(1L,2L,3L)
> a = arrow::Array$create(v)
> 
> .Internal(inspect(v))
@0x00000248ddac1f38 13 INTSXP g0c2 [REF(5)] (len=3, tl=0) 1,2,3
> .Internal(inspect(v[1]))
@0x00000248d5bc3dd0 13 INTSXP g0c1 [] (len=1, tl=0) 1
> 
> d = a$as_vector()
> .Internal(inspect(d))
@0x00000248da541230 13 INTSXP g0c0 [REF(65535)] arrow::ChunkedArray<0x00000248dac3e2b0, int32, 1 chunks, 0 nulls> len=3
> .Internal(inspect(d[1]))
@0x00000248d5bc3fc8 13 INTSXP g0c1 [] (len=1, tl=0) 1
mccptt67

mccptt671#

我不太清楚你的目标是什么?如果你想看看从vector〉arrow转换是否会创建一个a副本,你有你的答案:是的,这就是内存地址不同的原因。
将R向量转换为箭头数组会通过libarrow C++库将其转换为箭头内存布局,该库位于R之外的内存中。您可以通过保存和加载箭头对象来确认这一点:

r$> save(a, file = "test")

r$> load("test")

r$> a
Array
Error: Invalid <Array>, external pointer to null

相关问题