【问题标题】:R: How to combine 300 1GB .rds files into 1 large rds file without reading them into memory?R:如何将 300 个 1GB .rds 文件合并为 1 个大 rds 文件而不将它们读入内存?
【发布时间】:2020-11-26 10:26:26
【问题描述】:

我有 300 多个 .rds 文件,每个文件都有相同的列名,我想将它们绑定到一个压缩的 .rds 文件中,我可以通过 sftp 传输该文件。

有没有办法在不将它们读入内存的情况下有效地做到这一点?

目前我正在使用以下代码,但这会在写入文件之前最大化内存。任何想法都非常感谢。

library(tidyverse)
library(data.table)

df <- list.files(pattern = ".rds") %>%
         map(readRDS) %>% 
         data.table::rbindlist()

    saveRDS(df,"df.rds")

最终我一一阅读并使用read::write_csv("name.csv",append=TRUE) 将它们附加到磁盘上。之后我使用 {disk.frame} 或 SQL 数据库来处理数据。

【问题讨论】:

  • AFAIK,您不能将数据附加到 RDS 文件。文件格式适用于任意 R 对象。仅附加对于表格数据是明智的。如果您使用未压缩的 RDS,您可能能够破解具有低级功能的东西,但这将是大量的工作。购买/租用更多 RAM 会更便宜。
  • 就我个人而言,我使用 CSV 并在传输前简单地压缩它。
  • 即使你以某种方式设法做到这一点,你认为如何打开那个巨大的(300GB)文件?
  • 您提到您使用disk.frame 将比内存文件更大的文件拆分为更小的块。为什么不直接压缩 disk.frame 文件夹而不是尝试创建单个 .rds?
  • @MadsBoyd-Madsen 你能补充更多细节吗?我不熟悉流式传输 rds 文件。你有一些关于如何做的参考吗?

标签: r


【解决方案1】:

正如其他人评论的那样,附加/合并.rds 文件可能是不可能的(或至少非常困难)。但是,如果它们是简单的列,那么将它们转换为.csv 应该会有问题。在这种情况下,可以附加它们,假设(如您所说)它们具有匹配的列名。

这个 sn-p 从.rds 文件名列表中读取,并将它们的数据附加到.csv。我几乎没有 R 经验,所以我不确定如何管理底层资源,但原则上,这种方法应该允许您一次只读取一个文件,从而在构建时将内存消耗保持在 ~1GB你的 ~300GB .csv.

fileNames <- list('test-one.rds', 'test-two.rds')

for (fileName in fileNames)
{
    rds <- readRDS(fileName)
    for (row in rds){
        write(row, file = 'out.csv', append = TRUE)
    }
}

【讨论】:

    【解决方案2】:

    如果您的最终目的是传输数据,请在 sql server 中读取和写入数据。

    您可以将 .rds 转换为 .csv 并使用 HeidiSQL 快速导入到您的 csv 结构的表格中。

    然后在另一端,您可以从 SQL 读取数据并再次将它们转换为 .rds 或直接发送 .csv。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 2017-03-01
      • 2014-10-22
      • 1970-01-01
      • 2021-02-11
      • 2015-09-10
      相关资源
      最近更新 更多