R列表对象的大小大于相应的原始数据文件

时间:2018-10-14 00:42:27

标签: r list csv dataframe import

我有一个导入到R中的CSV文件,然后分成几个子集,这些子集构成了我的列表“ 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倍,那么恐怕内存使用将很快失去控制。

谢谢!

1 个答案:

答案 0 :(得分:2)

memory usage Advanced R 书中所述,数字矢量每个元素占8个字节,整数矢量每个元素占4个字节,复数矢量每个元素占16个字节。

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

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

  • 采样:分析输入数据的随机采样,
  • 子集:按子集处理数据,然后合并结果,并且
  • 汇总:将数据汇总到较高的分析单位,然后进行分析。

由于R将所有对象都加载到内存中以进行处理,因此,不仅必须有足够的RAM来加载对象,而且还必须有足够的RAM来处理对象,包括写入其他输出对象。

请注意,诸如data.tabletibble之类的存储格式比基本R data.frame更为有效,并且可以节省多达50%的RAM使用率,正如我在{ {3}}。