【问题标题】:R list object size larger than corresponding raw data fileR列表对象大小大于相应的原始数据文件
【发布时间】:2019-03-18 19:23:18
【问题描述】:

我有一个 CSV 文件导入到 R 中,然后分成几个子集,这些子集构成了我的列表“importedData”:

filePath <- "Test.csv"
rowsPerBatch <- 58

numRows <- length(count.fields(file = filePath, sep = ","))
readSegment <- function(x) fread(file = filePath, sep = ",", header = TRUE, skip = rowsPerBatch*(x-1), nrows = rowsPerBatch-1)
importedData <- lapply(1:(numRows/rowsPerBatch), readSegment)

原始 CSV 文件只有 4MB。但是,R 中的列表对象是 17.8 MB 大。为什么会这样?有没有办法更有效地执行上述操作?

我计划扩大上述算法以处理几十个 CSV 文件,每个文件 >200MB。如果他们在R中对应的每个列表对象都是原来的3倍大小,恐怕内存使用会很快失控。

谢谢!

【问题讨论】:

    标签: r list csv dataframe import


    【解决方案1】:

    正如 Advanced R 书的memory usage 部分所述,数字向量每个元素占用 8 个字节,整数向量每个元素占用 4 个字节,复数向量每个元素占用 16 个字节。

    因此,根据输入 CSV 文件中的行数和列数,生成的 R 对象可能比输入 CSV 文件大很多。

    根据机器上用于处理数据的可用 RAM 量,R 用户依靠以下策略来处理有限的内存,包括:

    • 采样:分析输入数据的随机样本,
    • 子集:处理子集中的数据,然后合并结果,然后
    • 聚合:将数据聚合到更高的分析单元,然后对其进行分析。

    由于 R 将所有对象加载到内存中以便处理它们,因此不仅必须有足够的 RAM 来加载对象,还必须有足够的 RAM 来处理对象,包括写入额外的输出对象。

    请注意,data.tabletibble 等存储格式比 Base R data.frame 更有效,并且可以节省多达 50% 的 RAM 使用率,正如我在 American Community Survey Example 中说明的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2012-01-05
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多