我有一个导入到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倍,那么恐怕内存使用将很快失去控制。
谢谢!
答案 0 :(得分:2)
如memory usage的 Advanced R 书中所述,数字矢量每个元素占8个字节,整数矢量每个元素占4个字节,复数矢量每个元素占16个字节。
因此,根据输入CSV文件中的行和列数,所得的R对象可能比输入CSV文件大得多。
根据用于处理数据的计算机上可用的RAM量,R用户依赖以下策略来处理有限的内存,包括:
由于R将所有对象都加载到内存中以进行处理,因此,不仅必须有足够的RAM来加载对象,而且还必须有足够的RAM来处理对象,包括写入其他输出对象。
请注意,诸如data.table
和tibble
之类的存储格式比基本R data.frame
更为有效,并且可以节省多达50%的RAM使用率,正如我在{ {3}}。