我正在尝试将大型(~700Mb).csv文件读入R。
该文件包含一个小于256的整数数组,带有标题行和2个标题列。
我用:
trainSet <- read.csv(trainFileName)
这最终barfs:
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
考虑一下内存使用情况,它在崩溃时使用零页面文件的6Gb机器上大约使用3Gb,因此可能有另一种方法可以解决它。
如果我使用:
trainSet <- read.csv(trainFileName, header=TRUE, nrows=100)
classes = sapply(train,class);
我可以看到所有列都被加载为“整数”,我认为是32位。
显然,使用3Gb加载700Mb .csv文件的一部分远非效率。我想知道是否有办法告诉R使用8位数字作为列?这就是我过去在Matlab中所做的事情,并且它是一种享受,但是,我似乎无法在R中找到任何提及8位类型的内容。
它存在吗?我怎么告诉它read.csv使用它?
提前感谢您的帮助。
答案 0 :(得分:2)
答案 1 :(得分:2)
问:你能告诉R使用8位数
<答>答:没有。(编辑:见Dirk的评论如下。他比我聪明。)问:更多RAM会有帮助吗?
答:可能。假设64位操作系统和64位R实例是起始点,则为“是”,否则为“否”。隐含问题A:read.csv
读入时,700 MB的.csv数据集是700 MB吗?
colClasses="integer"
。否则,如果存在任何数据输入毛刺,它们可能会被存储为因子或8字节“数字”。
隐含问题B:如果您将数据导入工作区,您是否可以使用它?
答:只有可能。你需要的内存至少是最大对象的三倍,因为R副本的分配方式即使它是一个副本到自己的名字。
答案 2 :(得分:2)
不要试图嗤之以鼻,但?read.csv
中记录了修复此问题的方法:
These functions can use a surprising amount of memory when reading large files. There is extensive discussion in the ‘R Data Import/Export’ manual, supplementing the notes here. Less memory will be used if ‘colClasses’ is specified as one of the six atomic vector classes. This can be particularly so when reading a column that takes many distinct numeric values, as storing each distinct value as a character string can take up to 14 times as much memory as storing it as an integer. Using ‘nrows’, even as a mild over-estimate, will help memory usage.
这个例子需要一段时间才能运行,因为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 Mb