退出并从R(Windows 7,RGui 64位)中重新启动干净的R会话
我正试图从R中退出并重新启动R。原因是我的作业占用了大量内存,清理R工作区的常用选项中没有一个回收R占用的RAM。退出并从R(Windows 7,RGui 64位)中重新启动干净的R会话,r,session,alias,R,Session,Alias,我正试图从R中退出并重新启动R。原因是我的作业占用了大量内存,清理R工作区的常用选项中没有一个回收R占用的RAM。gc(),closeAllConnections(),rm(list=ls(all=TRUE))清除工作区,但是当我检查Windows任务管理器中的进程时,R对RAM的使用保持不变。当R会话重新启动时,将回收内存 我试过这篇文章的建议: 但它在我的机器上不工作。它会关闭R,但不会再次打开它。我在Windows7上通过RGui(64位)运行Rx64 3.0.2。也许这只是上面文章第一
gc()
,closeAllConnections()
,rm(list=ls(all=TRUE))
清除工作区,但是当我检查Windows任务管理器中的进程时,R对RAM的使用保持不变。当R会话重新启动时,将回收内存
我试过这篇文章的建议:
但它在我的机器上不工作。它会关闭R,但不会再次打开它。我在Windows7上通过RGui(64位)运行Rx64 3.0.2。也许这只是上面文章第一行的一个简单调整:
makeActiveBinding("refresh", function() { shell("Rgui"); q("no") }, .GlobalEnv)
但我不确定该如何改变
这是代码。它不是完全可复制的,因为需要一个大的文件列表,这些文件需要被读取和刮取。消耗内存的是scrape.func()
;其他的都很小。在代码中,我将scrape函数应用于一个文件夹中的所有文件。最后,我想申请一组文件夹,每个文件夹都有大量文件(每个文件夹约12000个;50多个文件夹)。目前这样做是不可能的,因为R很快就会耗尽内存
library(XML)
library(R.utils)
## define scraper function
scrape.func <- function(file.name){
require(XML)
## read in (zipped) html file
txt <- readLines(gunzip(file.name))
## parse html
doc <- htmlTreeParse(txt, useInternalNodes = TRUE)
## extract information
top.data <- xpathSApply(doc, "//td[@valign='top']", xmlValue)
id <- top.data[which(top.data=="I.D.:") + 1]
pub.date <- top.data[which(top.data=="Data publicarii:") + 1]
doc.type <- top.data[which(top.data=="Tipul documentului:") + 1]
## tie into dataframe
df <- data.frame(
id, pub.date, doc.type, stringsAsFactors=F)
return(df)
# clean up
closeAllConnections()
rm(txt)
rm(top.data)
rm(doc)
gc()
}
## where to store the scraped data
file.create("/extract.top.data.2008.1.csv")
## extract the list of files from the target folder
write(list.files(path = "/2008/01"),
file = "/list.files.2008.1.txt")
## count the number of files
length.list <- length(readLines("/list.files.2008.1.txt"))
length.list <- length.list - 1
## read in filename by filename and scrape
for (i in 0:length.list){
## read in line by line
line <- scan("/list.files.2008.1.txt", '',
skip = i, nlines = 1, sep = '\n', quiet = TRUE)
## catch the full path
filename <- paste0("/2008/01/", as.character(line))
## scrape
data <- scrape.func(filename)
## append output to results file
write.table(data,file = /extract.top.data.2008.1.csv",
append = TRUE, sep = ",", col.names = FALSE)
## rezip the html
filename2 <- sub(".gz","",filename)
gzip(filename2)
}
库(XML)
图书馆(R.utils)
##定义刮刀功能
scrape.func我也做了一些网络垃圾,直接遇到了和你一样的问题,这让我发疯了。虽然我运行的是现代操作系统(Windows10),但内存仍然没有不时释放。在看了一下我的搜索结果后,这里你可以设置一个自动内存清理器,大约每5分钟一次。一定要使用
rm(list = ls())
gc()
closeAllConnections()
之前,以便R释放内存。
然后使用CleanMem,这样操作系统就会注意到有可用的内存。也许在函数末尾对rm
的调用永远不会被计算,因为它们是在函数结尾的return
语句之后进行的。此外,它们不是必需的,因为这些对象只存在于函数环境中。@Roland:未计算的closeAllConnections
调用可能会有更大的问题。rm
调用是不必要的,因为一旦函数返回,这些对象将可用于gc
。@JoshuaUlrich:感谢Joshua提供的链接;我现在意识到这是OS的错。但在我看来,唯一的解决办法还是重启R,因为这会让操作系统释放内存。我仍然不知道如何在R脚本中实现这一点Marko@Roland:罗兰,谢谢你的更正。但是,在函数中移动rm
调用不会显著减少内存使用。-马尔科