R:可能截断> = 4GB文件

时间:2017-03-11 20:24:13

标签: r unzip

我有一个370MB的zip文件,内容是一个4.2GB的csv文件。

我做了:

unzip("year2015.zip", exdir = "csv_folder")

我收到了这条消息:

1: In unzip("year2015.zip", exdir = "csv_folder") :
  possible truncation of >= 4GB file

你以前经历过吗?你是怎么解决的?

3 个答案:

答案 0 :(得分:5)

检查Note,在{{1}}中找到以下评论:

  

它确实支持bzip2压缩和> 2GB zip文件   (但不包括zip文件中包含的> = 4GB文件预压缩:喜欢   解压缩它的许多版本可能会截断这些,在R的情况下会发出警告   如果可能的话。)

您可以尝试将其解压缩到R之外(例如,使用7-Zip)。

答案 1 :(得分:5)

我同意@Sixiang.Hu的回答,R&#39的解压缩()在大于4GB的文件下无法可靠地工作。

要获得你是如何解决它的?:我已经尝试了一些不同的技巧,根据我的经验,任何使用R&#39内置插件的结果在文件的实际结束之前(几乎)总是不正确地识别文件结束(EOF)标记。

我在每晚处理的一组文件中处理这个问题,为了一致地以自动方式处理它,我将下面的函数编写为解压UNIX解压缩。这基本上就是你在系统中所做的事情(unzip()),但是它给你的行为提供了更多的灵活性,并允许你更系统地检查错误。

decompress_file <- function(directory, file, .file_cache = FALSE) {

    if (.file_cache == TRUE) {
       print("decompression skipped")
    } else {

      # Set working directory for decompression
      # simplifies unzip directory location behavior
      wd <- getwd()
      setwd(directory)

      # Run decompression
      decompression <-
        system2("unzip",
                args = c("-o", # include override flag
                         file),
                stdout = TRUE)

      # uncomment to delete archive once decompressed
      # file.remove(file) 

      # Reset working directory
      setwd(wd); rm(wd)

      # Test for success criteria
      # change the search depending on 
      # your implementation
      if (grepl("Warning message", tail(decompression, 1))) {
        print(decompression)
      }
    }
}    

注意:

该功能做了一些我喜欢和推荐的事情:

  • 使用system2而不是系统,因为the documentation说&#34; system2是一个比系统更便携,更灵活的界面&#34;
  • 分隔directoryfile参数,并将工作目录移动到directory参数;取决于你的系统,解压缩(或你选择的解压缩工具)在解压缩工作目录之外的档案时变得非常挑剔
    • 它不纯,但重置工作目录是朝向具有较少副作用的功能迈出的一小步
    • 你可以在没有这个的情况下从技术上做到这一点,但根据我的经验,使这个功能更容易,而不是处理生成文件路径和记住解压缩CLI标志
  • 我将它设置为使用-o标志在重新运行时自动覆盖,但您可以提供任意数量的参数
  • 包含一个.file_cache参数,允许您跳过解压缩
    • 如果您正在测试在解压缩文件上运行的进程,这会派上用场,因为4GB +文件往往需要一些时间来解压缩
  • 在此示例中已注释掉,但如果您知道在解压缩后不需要存档,则可以将其内联删除
  • system2命令将stdout重定向到解压缩,即字符向量
    • 最后的if + grepl检查在stdout中查找警告,如果找到该表达式则打印stdout

答案 2 :(得分:0)

要添加到可能的解决方案列表中,如果您的计算机上有Java(JDK),则可以将jar xf包装到类似于utils::unzip()接口的R函数中,这非常简单例如:

unzipLarge <- function(zipfile, exdir = getwd()) {
  oldWd <- getwd()
  on.exit(setwd(oldWd))
  setwd(exdir)
  system2("jar", args = c("xf", zipfile))
}

然后使用:

unzipLarge("year2015.zip", exdir = "csv_folder")