私はdata.table::address
または.Internal(address())
を使用してメモリ内のさまざまなオブジェクトを追跡しようとしましたが、一部のオブジェクトは毎回同じアドレスを返すことに気付きました。ここで何が起こっているのですか?他のメモリアドレスが変更されている間に、一部のメモリアドレスが一定の理由で報告されるのはなぜですか?
私はリスト(data.tables、data.framesなど)のようなオブジェクトのアドレスは(これらの関数によって報告されているように)一定であることに気付きましたが、アドレスを[
でリストに報告しようとするとaddress(lst[1])
私は毎回異なる結果を得ます。一方、lst[[1]]
は同じ値を返し、address(pi)
のような定数のアドレスは一定のままですが、address(1)
はvolatileです。なぜこうなった?
## Create some data.tables of different sizes and plot the addresses
library(data.table)
par(mfrow = c(2,2))
for (i in 2:5) {
dat <- data.table(a=1:10^i)
## Constants
addr1 <- address(dat)
addr2 <- address(dat[[1]])
addr3 <- address(dat$a) # same as addr2
## Vary
addrs <- replicate(5000, address(dat[1]))
plot(density(as.integer(as.hexmode(addrs))), main=sprintf("N: %g", nrow(dat)))
abline(v=as.integer(as.hexmode(c(addr1, addr2, addr3))), col=1:3, lwd=2, lty=1:3)
legend("topleft", c("dat", "dat[[1]]", "dat$a"), col=1:3, lwd=2, lty=1:3)
}
ここでは、私はさまざまなサイズのdata.tablesで話しているのいくつかの例です。それらは、address(dat[1])
(整数に変換された)の結果の密度であり、その行はdata.tableの定数アドレスに対応しています。
私は完全な答えはありませんが(Cコードを勉強する必要があります)、いくつかの提案があります。 '[['と '$'は単一のリスト要素を返します。しかし、 '['は1つ以上のリスト要素を含むリストを返します。つまり、これらの要素がコピーされます。特定の状況でこれらのコピーを避ける最適化が可能かもしれませんが、そのトピックは私の給与等級以上です。 – Roland
スカラーインデキシングリストを '' ["" '[[" 'と違うオブジェクトをコピーするか、どうしたのですか? '' [リスト "のようなオブジェクトだけが返される新しいSEXPを割り当てていないようで、サブセットを抽出するコピーは行われません。また、作成された変数(「pi」など)とは異なり、「1」と入力すると毎回新しいオブジェクトが作成されます。 –
@時間:値 "a"を持つ2つの変数を作成する場合、STRSXPがあります。キャッシュにはアクセスできないCHARSXPが含まれます。例:straddr = inline :: cfunction(sig = c(x = "character")、body = 'Rprintf( "%p \\ n"、x);') '; (STRING_ELT(x、0)); ') 'charaddr =インライン:: cfunction(sig = c(x ="文字 ")、body =' Rprintf("%p \\ n " 'x =" a "; y = "a"。 'straddr(x); straddr(y); charaddr(x); charaddr(y) '。 –