我试图更好地理解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)。