没有足够的空间为13K pdf文档运行循环时出现错误

时间:2019-07-12 17:19:17

标签: r batch-processing

我正在为13K pdf文件做循环,它在其中读取,预处理文本,查找相似之处并以txt形式写入。但是,当我运行for循环时,会出现错误

  

Error in poppler_pdf_text(loadfile(pdf), opw, upw) : Not enough space

可能是什么原因?

  1. 我尝试增加memory_limit(),这也不是问题。
  2. 我尝试删除文件夹中的隐藏文件,例如Thumbs.db,但是再次出现相同的问题。
  3. 我每次迭代都删除pdf文件。

folder_path <- "C: ...."
## get vector with all pdf names
pdf_folder <- list.files(folder.path)

## for loop over all pdf documents
for(s in 1:length(pdf_folder)){

   ## choose one pdf document from vector of strings
   pdf_document_name <- pdf_folder[s]

   ## read pdf_document pdf into data.frame
   pdf <- read_pdf(paste0(folder_path,"/",pdf_document_name))

   print(s)

   rm(pdf)

} ## end of for loop

# Error: 

Error in poppler_pdf_text(loadfile(pdf), opw, upw) : Not enough space

预期结果是读取原始路径中的所有pdf文档。

2 个答案:

答案 0 :(得分:0)

我能够通过以下方式重现此错误:

  • 基于图像的pdf(16,702页,161,277 KB)
  • R v3.5.3 64位
  • textreadr v0.90
  • pdftools v2.2
  • tesseract v4.0
  • Windows 10 64位
  • 16 GB RAM

textreadr :: read_pdf函数是pdftools :: pdf_text函数的包装器-错误消息中提到了该函数。 According to the docs pdf_text函数将所有文本框呈现在文本画布上,并返回与PDF文件中的页数相等长度的字符向量。

**编辑**

经过大量挖掘,it appears to be a problem is with the pdftools package and possibly the poppler library。如果您在运行textreadr :: read_pdf函数的同时观看任务管理器,则会发现RAM的使用显着增加。

您可以尝试this workaround,它已经为某些人工作了。我使用与以前相同的大pdf文件进行了尝试,并收到此错误:

pdf <- callr::r(function(){
    textreadr::read_pdf('filename.pdf')
})

Error in value[[3L]](cond) : 
  callr subprocess failed: could not start R, exited with non-zero status,
has crashed or was killed

答案 1 :(得分:0)

python中有一个生成器函数,该函数可以保存大量文档,而不会影响内存。您可以尝试使用相同的。我不确定您的代码是否在python中。即使不是在python中,您也可以合并python库并仅在python中执行这段代码。 python中还有一个 difflib 库,可以用单行代码比较文档。

请参考以下视频。

https://www.youtube.com/watch?v=bD05uGo_sVI