【问题标题】:R programming, after removing columns of data.frame, object.size() dropped, why rsession still consumes same memory?R编程,删除data.frame的列后,object.size()下降了,为什么rsession仍然消耗相同的内存?
【发布时间】:2023-03-21 23:05:01
【问题描述】:

我有一个名为 my.data 的 data.frame,它有 2,000 列和 object.size(my.data)

返回大约 450 MB。

我只保留我需要的那些(大约 300 列)删除了不必要的列

my.data <- my.data[,vars.keep]
gc()

然后我再次检查了 object.size(my.data),它仍然是 450 MB。我怎样才能以有效的方式取回内存?


只是想添加更多信息,Maurits 是对的。删除不必要的列后,对象大小显着减小,但 rsession 仍然使用相同的内存。为什么 rsession 不释放内存...?

format(object.size(transformed_data), units = "Mb");
[1] "40.5 Mb"
transformed_data <- transformed_data[,vars.keep]
format(object.size(transformed_data), units = "Mb");
[1] "5.3 Mb"

【问题讨论】:

    标签: r dataframe memory-management


    【解决方案1】:

    这听起来不对。您能否仔细检查您的代码,然后在新的 R 实例中重新运行您的代码。

    这是我得到的样本dataframe

    df <- as.data.frame(matrix(1e6, ncol = 2000, nrow = 1000));
    format(object.size(df), units = "Mb");
    # [1] "15.5 Mb"
    
    # Select only the first 100 columns
    df <- df[, 1:100];
    format(object.size(df), units = "Mb");
    # [1] "0.8 Mb"
    

    至于运行gc:根据this post,运行垃圾收集器“可能很好[...](至少不会受到伤害),即使它很可能会被触发(如果不是马上,那么很快)。”另一方面,Hadley Wickham 表示“你不应该调用 gc,而且如果你这样做也不会产生太大的影响。”

    【讨论】:

    • 谢谢 Maurits,让我检查一下并回复您
    • 嗨 Maurits,是的,你是对的。删除列后,对象大小显着减小。但是在 windows 资源管理器中,rsession.exe 的内存使用情况并没有改变。它保留了号码。所以这仍然没有帮助,因为我想释放一些内存。这是因为 rsession 会释放内存并稍后在创建其他对象时使用它吗?
    • 我认为这可能是一个无关的问题。 R 本身的内存管理将取决于操作系统。我不是 Windows 用户,但在 Linux 上,一些库以块的形式分配内存,并且只有在整个块被释放后才能释放内存。一般来说,如果可以的话,你的操作系统会释放内存。在调整 R 对象大小之前和之后使用 shell('systeminfo | findstr Memory') 监控您的内存使用情况可能是值得的。另请查看here,了解关于 R 如何释放内存的扩展讨论,可追溯到 2011 年。
    • 非常感谢您的详细建议。
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多