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