R支持8位变量吗?

时间:2012-09-04 20:58:41

标签: r csv 8-bit

我正在尝试将大型(~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使用它?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

答案很简单,附加软件包ff允许您使用更紧凑的表示。

缺点是不同的表示会阻止您将数据传递给标准函数。

因此,您可能需要重新考虑您的方法:可能对数据进行二次采样,或获得更多RAM。

答案 1 :(得分:2)

问:你能告诉R使用8位数

<答>答:没有。(编辑:见Dirk的评论如下。他比我聪明。)

问:更多RAM会有帮助吗?

答:可能。假设64位操作系统和64位R实例是起始点,则为“是”,否则为“否”。

隐含问题A:read.csv读入时,700 MB的.csv数据集是700 MB吗?

答:可能。如果它确实是全部整数,则可能更小或更大。每个整数需要4个字节,如果你的大多数整数都在-9到10的范围内,那么当它们每个存储为4个字节时,它们实际上可能会“扩展”。目前,每个值只使用1-3个字节,因此您可以预期大小增加50%您可能希望在读取函数中使用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