2

我正在尝试从 R 中退出并重新启动 R。原因是我的工作占用了大量内存,并且清理 R 的工作区的常用选项都没有回收 R 占用的 RAM。gc()、、清除工作区closeAllConnections()rm(list = ls(all = TRUE))但是当我检查 Windows 任务管理器中的进程时,R 对 RAM 的使用保持不变。当 R 会话重新启动时,内存被回收。

我已经尝试过这篇文章的建议:

从 R 中退出并重新启动干净的 R 会话?

但它在我的机器上不起作用。它关闭 R,但不会再次打开它。我在 Windows 7 上通过 RGui(64 位)运行 R x64 3.0.2。也许这只是对上述帖子第一行的简单调整:

makeActiveBinding("refresh", function() { shell("Rgui"); q("no") }, .GlobalEnv)

但我不确定它需要如何改变。

这是代码。它不是完全可重现的,因为需要读取和抓取大量文件列表。吃记忆的是scrape.func();其他一切都很小。在代码中,我将抓取功能应用于一个文件夹中的所有文件。最终,我想申请一组文件夹,每个文件夹都有大量文件(每个文件夹约 12,000 个;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)
}

非常感谢,马尔科

4

1 回答 1

1

我也做了一些网页抓取,直接遇到了和你一样的问题,这让我发疯了。尽管我运行的是现代操作系统(Windows 10),但内存仍然不时释放。在查看了R 常见问题解答后,我选择了CleanMem,在这里你可以每 5 分钟左右设置一个自动内存清理器。一定要使用

rm(list = ls())
gc()
closeAllConnections()

之前,以便 R 释放内存。然后使用 CleanMem 以便操作系统会注意到有可用内存。

于 2016-05-18T17:02:25.263 回答