我正在尝试将一个很大(约700MB)的.csv文件读入R。
该文件包含一个小于256的整数数组,其中有一个标题行和两个标题列。
我使用:
trainSet <- read.csv(trainFileName)这最终会让人反胃:
Loading Data...
R(2760) malloc: *** mmap(size=151552) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
R(2760) malloc: *** mmap(size=151552) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Error: cannot allocate vector of size 145 Kb
Execution halted查看内存使用率,在崩溃时页面文件使用率为零的6 3Gb机器上,它的使用率约为3 3Gb,因此可能有其他方法来修复它。
如果我使用:
trainSet <- read.csv(trainFileName, header=TRUE, nrows=100)
classes = sapply(train,class); 我可以看到所有的列都被加载为“整数”,我认为是32位。
显然,使用3 3Gb来加载一个700Mb的.csv文件的一部分是远远没有效率的。我想知道是否有一种方法可以告诉R对列使用8位数字?这就是我过去在Matlab中做的事情,它很有效,然而,我似乎找不到任何地方在R中提到8位类型。
它存在吗?我该如何告诉read.csv使用它呢?
提前感谢您的帮助。
发布于 2012-09-05 05:08:00
狭义的答案是,附加组件包ff允许您使用更紧凑的表示。
缺点是不同的表示形式会阻止您将数据传递给标准函数。
因此,您可能需要重新考虑您的方法:也许对数据进行二次采样,或者获得更多的RAM。
发布于 2012-09-05 05:31:52
问:你能告诉R使用8位数字吗?
答:没有。(编辑:参见下面Dirk的评论。他比我聪明。)
问:更多的RAM会有帮助吗?
答:也许吧。假设64位操作系统和64位R实例是起始点,则为"Yes",否则为"No“。
隐含问题A:当被read.csv读入时,700MB的.csv数据集是否也是700MB
答:也许吧。如果它真的都是整数,它可能会更小或更大。对于每个整数,它将占用4个字节,如果大多数整数在-9到10的范围内,那么当每个整数存储为4个字节时,它们实际上可能会“扩展”。目前,每个值仅使用1-3个字节,因此您可能希望在读取函数中使用colClasses="integer",大小将增加约50%。否则,如果有任何数据输入故障,它们可能会被存储为factor或8字节的“数字”。
隐含的问题B:如果您将数据放入工作区,您将能够使用它吗?
答:也许吧。您至少需要三倍于最大对象的内存,这是因为R在赋值时复制的方式,即使它是其自身名称的副本。
发布于 2012-09-05 07:21:50
我并不想刻薄,但是修复这个问题的方法在?read.csv中有说明
这些函数在读取大文件时会使用惊人的内存量。在“R数据导入/导出”手册中有广泛的讨论,补充了这里的注释。如果将‘colClasses’指定为六个原子向量类之一,将使用较少的内存。这在读取采用许多不同数值的列时尤其如此,因为将每个不同的值存储为字符串可能占用多达14倍的内存。使用‘nrows’,即使是轻微的高估,也会有助于内存的使用。
由于I/O的原因,此示例需要一段时间才能运行,即使使用我的SSD也是如此,但没有内存问题:
R> # In one R session
R> x <- matrix(sample(256,2e8,TRUE),ncol=2)
R> write.csv(x,"700mb.csv",row.names=FALSE)
R> # In a new R session
R> x <- read.csv("700mb.csv", colClasses=c("integer","integer"),
+ header=TRUE, nrows=1e8)
R> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 173632 9.3 350000 18.7 350000 18.7
Vcells 100276451 765.1 221142070 1687.2 200277306 1528.0
R> # Max memory used ~1.5Gb
R> print(object.size(x), units="Mb")
762.9 Mbhttps://stackoverflow.com/questions/12271274
复制相似问题