飞道的博客

2021美赛准备——内存管理(R语言)

657人阅读  评论(0)

0引言

今年的美赛C题由于数据量的原因在2021年1月21日提前15天发布了数据下载方式。详情见文章链接。但是遗憾的是给设置了解压密码,也就是单纯只让提前下载,总的来说就是发了个寂寞。但是唯一的信息是压缩包的大小是633M。但是我们不知道他的压缩方式是什么,所以也很难知道具体的数据大小。
下面是我按着体积最小进行压缩的文件前后内存大小:
可以看到535M的文件解压后后是3.64G,所以按着比例计算美赛的数据大小在633M-4.3G之间,应该不会太大。有些人担心今年的美赛C题数据量太大,自己电脑处理不了,考虑买不买服务器、数据库、或者转战其他题目等问题。这里说一下正常情况下R语言win10 8G运存应该是可以处理的了的(我跑过大约5G的数据、大约刚刚碰到R语言的上限8000+,8000实啥下面具体介绍)。当然在要注意自己的编程习惯,保持R内存中的占用要尽可能的小。看着很多基础书上都没介绍这部分,下面总结一下本人常用的R语言内存管理命令。

1、内存管理技巧

win 10中的R语言常见的内存管理命令在基础包和pryr包里,我一般处理大点的数据单纯用基础包里的函数,所以本文介绍的命令来自基础包的函数。

1.1、电脑配置

因为R里的内存上限和电脑的配置是有关系的,所以先给大家看一下相关的参数。

我的电脑是8G的运存。大家在此电脑->右键->属性可以查看自己电脑的内存。

1.2 R版本说明

我用的R3.6.2的版本,一年前的版本了,版本不是越新越好,当然只要别太老。一般只要自己的版本不出问题用就是了。当然说一句,默认的内存上限和版本没关系。
下面是版本信息:

R version 3.6.2 (2019-12-12) -- "Dark and Stormy Night"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)
R是自由软件,不带任何担保。
在某些条件下你可以将其自由散布。
用'license()''licence()'来看散布的详细条件。
R是个合作计划,有许多人为之做出了贡献.
用'contributors()'来看合作者的详细情况
用'citation()'会告诉你如何在出版物中正确地引用R或R程序包。
用'demo()'来看一些示范程序,用'help()'来阅读在线帮助文件,或
用'help.start()'通过HTML浏览器来看帮助文件。
用'q()'退出R.

1.3 memory.size

函数memory.size是用来查看和设置R语言内存的,先给出示例,在说具体注意事项。

> memory.size(NA) 
[1] 8112.24
> memory.size(8000) 
[1] 8112.24
Warning message:
In memory.size(8000) : 无法减少内存极限:忽视不用
> memory.size(9000) 
[1] 9000
> memory.size(NA)
[1] 9000
memory.size(F) #查看当前已使用的内存
[1] 28.54

说明:
– 参数是NA时,查看默认的内存上限,我的电脑是8G内存,所以他的默认上限是8112,同理:你的电脑是4G默认就是4000+、是32G默认就是32000+
– 可以像memory.size(8000)设置R语言的占用内存上限,但是上面例子也看到了只能往高了设置。
– 参数是F时,可以查看已经使用可多少内存。
– 问题来了,内存是否可以无限的加。就是你的电脑是8G,你设置到20000也就是想像20G运存的电脑一样处理数据。具体实践可以知道:这个上限可以适度的调整,我最多调到过10000。也就是自身内存上浮20%这里不建议上调太多
– 可以上调,不建议上调太多。

1.4 rm()

这个函数是基础函数,给个例子就不具体讲解了。
函数体:

> rm
function (..., list = character(), pos = -1, envir = as.environment(pos), 
    inherits = FALSE) 
{
   
    dots <- match.call(expand.dots = FALSE)$...
    if (length(dots) && !all(vapply(dots, function(x) is.symbol(x) || 
        is.character(x), NA, USE.NAMES = FALSE))) 
        stop("... must contain names or character strings")
    names <- vapply(dots, as.character, "")
    if (length(names) == 0L) 
        names <- character()
    list <- .Primitive("c")(list, names)
    .Internal(remove(list, envir, inherits))
}
<bytecode: 0x000000001523b598>
<environment: namespace:base>

例子:

> Data
    x  y
1   1  2
2   2  3
3   3  4
4   4  5
5   5  6
6   6  7
7   7  8
8   8  9
9   9 10
10 10 11
> rm(Data)
> Data
错误: 找不到对象'Data'

不用的变量及时清除、不要相同数据用两个变量存取。

1.5 gc()

使用rm函数清理完之后内存可能不会及时释放,可以运行一下这个函数释放内存。
函数体:

> gc
function (verbose = getOption("verbose"), reset = FALSE, 
    full = TRUE) 
{
   
    res <- .Internal(gc(verbose, reset, full))
    res <- matrix(res, 2L, 7L, dimnames = list(c("Ncells", 
        "Vcells"), c("used", "(Mb)", "gc trigger", 
        "(Mb)", "limit (Mb)", "max used", "(Mb)")))
    if (all(is.na(res[, 5L]))) 
        res[, -5L]
    else res
}
<bytecode: 0x000000001206a6a0>
<environment: namespace:base>

例子:

> Data <- data.frame(x = 1:10, y = 2:11)
> Data
    x  y
1   1  2
2   2  3
3   3  4
4   4  5
5   5  6
6   6  7
7   7  8
8   8  9
9   9 10
10 10 11
> gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 280221 15.0     621691 33.3   427419 22.9
Vcells 690074  5.3    8388608 64.0  2553615 19.5
> Data
    x  y
1   1  2
2   2  3
3   3  4
4   4  5
5   5  6
6   6  7
7   7  8
8   8  9
9   9 10
10 10 11
> 

总结

内存管理还有很多函数去管理跟踪每一步每一个变量的内存占用。但是作为即将参赛的我们主要经历应该放在模型实现上,学习本文的函数就已经足够了。在本次美赛中就不会遇到棘手的内存问题,即使遇到也能及时定位问题得到解决。
希望可以帮助大家学习R语言。水平有限发现错误还望及时评论区指正,您的意见和批评是我不断前进的动力。
最后祝大家有个好成绩,冲呀!!!


转载:https://blog.csdn.net/weixin_46111814/article/details/113187191
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场