拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 R中物件的存储器分配

R中物件的存储器分配

白鹭 - 2022-02-11 2091 0 0

我试图了解 R 中的存储器分配。所以我填充了两种结果相同的方法。那么这是否意味着分配较少的方法是有效的

例如

## Method 1
f <- function(num) {
  for(i in seq_len(num)) {
    cat("Hello, world!\n") }}

object.size(f(1))
Hello, world!
  0 bytes

## Method 2
asd <- "Hello, world!"
object.size(asd)
120 bytes

因此,如果您在上面看到,方法 1 比方法 1 更有效,对吧?(分别为 0 和 120 字节)

我的理解正确吗?

uj5u.com热心网友回复:

你不是在比较喜欢和喜欢。您的函式打印"Hello, world!"但不回传任何内容。因此,当您运行时object.size(f(1)),您实际上是在运行object.size(NULL),即 0(什么都没有的大小)。

如果您更改函式以使其回传字符串,则它等效于方法 2(为字符串赋值):

f <- function(num) {
    for (i in seq_len(num)) {
        return("Hello, world!\n")
    }
}

object.size(f(1)) # 120 bytes
object.size(f(1)) == object.size("Hello, world!") # TRUE

无论哪种情况,您都在测量字符串的大小。但是,在这种情况下简单地分配字符串将使用更少的 RAM,因为函式本身会占用存储器空间:

object.size(f) # 16088 bytes

即使是 R 中的一个空函式也会占用大约 4k 的 RAM:

g  <- function() {
    return(TRUE)
}
object.size(g) # 4384 bytes

话虽如此,鉴于在 R 中您通常使用 RAM 中保存的资料,相比之下,开销存盘函式的数量通常可以忽略不计。大多数时候,在 R 中,您将希望优化代码的清晰度(即使用函式),而不是少量的 RAM。不过也有例外(例如,在回圈中呼叫一个函式数百万次)。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *