0

我正在尝试将一个大的(~700Mb).csv 文件读入 R。

该文件包含一个小于 256 的整数数组,带有一个标题行和 2 个标题列。

我用:

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

查看内存使用情况,它在崩溃时页面文件使用量为零的 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 使用它?

提前感谢您的帮助。

4

3 回答 3

2

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

答:不。(编辑:见下面 Dirk 的评论。他比我聪明。)

问:更多 RAM 会有帮助吗?

答:也许吧。假设 64 位操作系统和 R 的 64 位实例是起点,则为“是”,否则为“否”。

隐含的问题 A:700 MB 的 .csv 数据集在被 读取时是否为 700 MB read.csv

答:也许吧。如果它真的是整数,它可能会更小或更大。每个整数将占用 4 个字节,如果您的大多数整数都在 -9 到 10 的范围内,那么当每个整数存储为 4 个字节时,它们实际上可能会“扩展”大小。目前,每个值只使用 1-3 个字节,因此您希望colClasses="integer"在读取功能中使用大约 50% 的大小。否则,如果存在任何数据输入故障,它们可能会被存储为因子或 8 字节“数字”。

隐含的问题 B:如果您将数据放入工作区,您将能够使用它吗?

答:只有可能。由于 R 在分配时复制的方式,即使它是其自己名称的副本,您至少需要比最大对象多三倍的内存。

于 2012-09-04T21:31:52.240 回答
2

狭义的答案是附加包ff允许您使用更紧凑的表示。

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

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

于 2012-09-04T21:07:59.580 回答
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
于 2012-09-04T23:21:50.333 回答