Почему мой R-скрипт использует всю память компьютера? - PullRequest
0 голосов
/ 19 февраля 2020

Я написал простой скрипт, который открывает каждый документ .docx из моих папок и ищет определенные слова. Если какое-либо из слов существует, оно извлекает идентификационный номер и затем переходит к следующему документу. Проблема в том, что после ~ 1500 документов, он занимает всю память компьютера, а R застревает и прерывает работу. Я не знаю, почему это происходит - мой сценарий не должен использовать так много памяти. Любое предложение будет оценено!

rm(list=ls()) #clean environment
library(qdapTools)
setwd("C:/DocxArchive/ParentFolder")
results <- 0 #store results here
years_list <- c("2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020")

for (year_index in 1:11) {
  parent_dir <- years_list[year_index]     
  file_list <- list.files(path = parent_dir, recursive = TRUE) #get list of file names
  items_to_delete <- grep('~',file_list) #find temporary files - name begins with '~'
  file_list <- file_list[-items_to_delete] #delete temporary files from file list
  length_of_file_list <- length(file_list)
  file_num <- 1 #initialize file number index
  while(file_num <= length_of_file_list){ 
    DOCX <- read_docx(file=file.path(parent_dir, file_list[file_num]))
      index_of_HITEC1 <- grepl("HI TEC", DOCX, fixed=FALSE, ignore.case=TRUE) 
      index_of_HITEC2 <- grepl("HITEC", DOCX, fixed=FALSE, ignore.case=TRUE) 
      index_of_HITEC3 <- grepl("HI-TEC", DOCX, fixed=FALSE, ignore.case=TRUE) 
      HITEC1_num <- which.max(index_of_HITEC1) #line in document where word exists
      HITEC2_num <- which.max(index_of_HITEC2) #line in document where word exists
      HITEC3_num <- which.max(index_of_HITEC3) #line in document where word exists
      HITEC_sum <- HITEC1_num+HITEC2_num+HITEC3_num
      if (HITEC_sum > 3){
        index_of_person_ID <- grepl("ID:", DOCX, fixed=TRUE) #find lines where ID exist
        text <- DOCX[index_of_person_ID==TRUE] #keep only lines where ID exist
        text <- gsub("[^0-9]","",text) #delete everything except numbers
        results <- c(results,text)
      } #end of if loop
      file_num <- file_num+1
   } #end of while loop 
} #end of for loop

Ответы [ 2 ]

3 голосов
/ 19 февраля 2020

Мы пробились во второй Круг, здесь живут обжоры.

Это может помочь вам прочитать немного R ад . Помимо возможной утечки памяти, вызванной read_docx, строка, которая мне показалась проблемной c:

results <- c(results, text)

В R Inferno Ch. Есть некоторые подробности. 2, но в основном, когда вы делаете это, вы получаете полную копию results со старого места в памяти на новое, и это происходит на каждой итерации l oop. Это означает, что большую часть времени вы будете использовать почти вдвое больше необходимой памяти и, возможно, гораздо больше, поскольку сборщик мусора R обычно освобождает память только при запросе.

Этот код можно улучшить, используя программирование другого шаблона для сохранения результатов или, если вам очень лень, периодическим вызовом gc() (скажем, каждая десятая итерация l oop).

0 голосов
/ 24 февраля 2020

Обновление: утечка памяти была ошибкой qdapTools::read_docx. Используя officer::read_docx, проблем нет.

...