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(); 他のすべてはかなり小さいです。コードでは、1 つのフォルダー内のすべてのファイルにスクレイプ機能を適用しています。最終的には、それぞれに多数のファイル (フォルダーあたり ~ 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

私もいくつかのウェブスクレイピングを行い、あなたと同じ問題に直接遭遇し、それは私を夢中にさせました. 現代のOS(Windows 10)を実行していますが、メモリは時々解放されません。R FAQを見た後、私はCleanMemに行きました。ここでは、5分ごとに自動メモリクリーナーを設定できます。必ず使用してください

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

Rがメモリを解放する前に。次に、CleanMem を使用して、空きメモリがあることを OS が認識できるようにします。

于 2016-05-18T17:02:25.263 に答える