Windows中意外的内存复制行为

时间:2019-06-14 16:10:47

标签: r memory

我试图更好地理解R的内存管理和“修改时复制”的思想。在Hadley Wickham的Advance R网站(https://adv-r.hadley.nz/names-values.html)上,似乎复制了矢量对象进行修改后,进一步的修改就不需要复制了:

# From Hadley's website, not my computer    
x <- c(1, 2, 3)
cat(tracemem(x), "\n")
#> <0x7f80c0e0ffc8>

y <- x
y[[3]] <- 4L
#> tracemem[0x7f80c0e0ffc8 -> 0x7f80c4427f40]:

y[[3]] <- 5L
# No copy

但是,当我在Windows计算机上实际运行它时,我看到了tracemem的第二个副本:

# Run on my windows desktop
x <- c(1, 2, 3)
cat(tracemem(x), "\n")
#> <000002089596EBB8> 
y <- x
y[[3]] <- 4L
#> tracemem[0x000002089596ebb8 -> 0x00000208960323d0]: 
y[[3]] <- 5L
#> tracemem[0x00000208960323d0 -> 0x00000208961ba540]:

此外,在了解了关于对象NAM(Is data really copied four times in R's replacement functions?)的思想之后,我发现即使在新的R会话中新创建的向量也是NAM(3),即使我曾期望NAM(1)

x <- c(1, 2, 3)
.Internal(inspect(x))
# 0x0000022abc9e4998 14 REALSXP g0c3 [NAM(3)] (len=3, tl=0) 1,2,3

还有其他人遇到这种情况吗?我的sessionInfo在下面。

  

R版本3.5.3(2019-03-11)平台:x86_64-w64-mingw32 / x64(64位)   运行在:Windows 10 x64(内部版本16299)

     

Matrix产品:默认

     

语言环境:[1] LC_COLLATE = English_United States.1252   LC_CTYPE = English_United States.1252 LC_MONETARY = English_United   States.1252 [4] LC_NUMERIC = C
  LC_TIME =英语_美国。1252

     

附加的基本软件包:[1]统计图形grDevices utils
  数据集方法基础

     通过名称空间(未附加)加载的

:[1] editor_3.5.3   tools_3.5.3

我还可以使用R 3.5.1访问Linux机器。在那台机器上,我没有第二个内存副本,但是我仍然看到新的向量是NAM(3)。

0 个答案:

没有答案