【问题标题】:R: How to quickly read large .dta files without RAM LimitationsR:如何在没有 RAM 限制的情况下快速读取大型 .dta 文件
【发布时间】:2016-12-13 17:17:17
【问题描述】:

我有一个 10 GB 的 .dta Stata 文件,我正在尝试将它读入 64 位 R 3.3.1。我正在使用大约 130 GB RAM(4 TB HD)的虚拟机,.dta 文件大约有 300 万行和 400 到 800 个变量。

我知道 data.table() 是读取 .txt 和 .csv 文件的最快方法,但是有没有人推荐将较大的 .dta 文件读取到 R 中?将文件作为 .dta 文件读入 Stata 大约需要 20-30 秒,尽管我需要在打开文件之前设置我的工作内存最大值(我将最大值设置为 100 GB)。

我没有尝试在 Stata 中导入 .csv,但我希望避免使用 Stata 接触文件。通过Using memisc to import stata .dta file into R 找到了一个解决方案,但这假设 RAM 是稀缺的。就我而言,我应该有足够的 RAM 来处理该文件。

【问题讨论】:

  • 如果您对 python 感到满意,您可以将您的 dta 文件转换为 csv 文件。 SO链接Convert Stata .dta file to CSV without Stata software在其中一个答案(不是最佳答案)中描述了这一点。
  • 如果你有足够的内存,foreign::read.dta() 应该可以工作,但它不适用于最新的 stata 格式。
  • 也许我应该更好地表达:目标是使用 R 并快速完成。 Read.dta 非常慢,我希望避免将文件转换为 .csv。
  • 仍然可以想象dta -> csv -> data.table 将是您最快的选择(尽管我希望不是)。如果我是你,我会查看 library(sos); findFn("stata dta") 的结果并在合理的(1GB?)大小子集上进行基准测试。

标签: r memory stata large-files


【解决方案1】:

在 R 中加载大型 Stata 数据集的最快方法是使用 readstata13 包。我在大型数据集in this post 上比较了foreignreadstata13haven 包的性能,结果反复表明readstata13 是R 中读取Stata 数据集的最快可用包。

【讨论】:

    【解决方案2】:

    我推荐haven R package。不像foreign,它可以读取最新的Stata格式:

    library(haven)
    data <- read_dta('myfile.dta')
    

    不确定它与其他选项相比有多快,但您在 R 中读取 Stata 文件的选择相当有限。我的理解是haven 包装了一个 C 库,所以它可能是您最快的选择。

    【讨论】:

      【解决方案3】:

      由于这篇文章是搜索结果的顶部,我在havenreadstata13 的当前版本上重新运行了基准测试。看起来这两个包在这一点上是可比的,haven 稍微好一点。就时间复杂度而言,它们都近似线性地作为行数的函数。

      这是运行基准测试的代码:

      sizes <- 10^(seq(2, 7, .5))
      
      benchmark_read <- function(n_rows){
      start_t_haven <- Sys.time()
      maisanta_dataset <- read_dta("my_large_file.dta"), n_max = n_rows)
      end_t_haven <- Sys.time()
      
      start_t_readstata13 <- Sys.time()
      maisanta_dataset <- read.dta13("my_large_file.dta", select.rows = n_rows)
      end_t_readstata13 <- Sys.time()
      
      tibble(size = n_rows, 
             haven_time = end_t_haven - start_t_haven, 
             readstata13_time = end_t_readstata13 - start_t_readstata13) %>% 
        return()
      }
      
      benchmark_results <-
      lapply(sizes, benchmark_read) %>% 
        bind_rows()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-14
        • 2012-07-21
        • 1970-01-01
        • 2019-08-22
        • 2020-07-10
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多