我在R中有一个data.table。我们称之为x
。我把它插入一个列表如下:
pars <- list(x = x)
由于我没有复制,我希望sapply(list(x, pars$x), tracemem)
给出的内存地址是相同的。他们是 (!)。
当我将x
和pars$x
保存到save_much.RData
文件中然后重新加载load(file = "save_much.RData")
时,会出现(潜在)问题。当我获得sapply(list(x, pars$x), tracemem)
给出的内存地址时重新加载时,我得到不同的内存地址。因此,当我没有明确希望这种情况发生时,已经制作了深层复制品。
总结请尝试以下操作,您将看到问题:
x <- data.table(rnorm(100, 0, 1))
pars <- list(x = x)
sapply(list(x, pars$x), tracemem)
save("x", "pars", file = "save_much.RData")
rm("x", "pars")
gc()
load(file = "save_much.RData")
sapply(list(x, pars$x), tracemem)
这对我来说是一个问题,因为我编写了一个引用类,其中x
和pars
是属性。我的期望是,因为x
和pars$x
指向同一个对象,所以在重新加载此引用类的特定实例时,我不应该获得不同的内存地址。
有没有人在使用data.table之前遇到过这个问题?如果这已经作为一个问题发布了,我很抱歉:第一次来SO!
这是我在R-3.2.2和data.table版本1.9.6上运行代码时看到的:
library(data.table)
data.table 1.9.6 For help type ?data.table or https://github.com/Rdatatable/data.table/wiki
The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
x <- data.table(rnorm(100, 0, 1))
pars <- list(x = x)
sapply(list(x, pars$x), tracemem)
[1] "<0000000005EFB9B8>" "<0000000005EFB9B8>"
save("x", "pars", file = "save_much.RData")
rm("x", "pars")
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 268518 14.4 460000 24.6 350000 18.7
Vcells 480006 3.7 1023718 7.9 786276 6.0
load(file = "save_much.RData")
sapply(list(x, pars$x), tracemem)
[1] "<0000000005F06618>" "<0000000005F06A68>"