R - 大数据 - 向量超过长度限制

3
我有以下的R代码:
data <- read.csv('testfile.data', header = T)
mat = as.matrix(data)

我的testfile.data文件的更多统计信息:

> ncol(data)
[1] 75713
> nrow(data)
[1] 44771

由于这是一个大型数据集,因此我正在使用具有64GB RAM空间的Amazon EC2。所以希望内存不会成为问题。我能够加载数据(第一行有效)。但是,as.matrix转换(第二行)会引发以下错误:

resulting vector exceeds vector length limit in 'AnswerType'

任何线索可以解决这个问题吗?
2个回答

12

如前所述,R的开发版本支持超过2^31-1的向量。这基本上是透明的,例如

> m = matrix(0L, .Machine$integer.max / 4, 5)
> length(m)
[1] 2684354555

这是使用

> R.version.string
[1] "R Under development (unstable) (2012-08-07 r60193)"

大型对象占用大量内存(例如我的例子中占用了16G的62.5%),而要执行任何有用的操作都需要多于这个数量的内存。此外,即使是对大数据进行简单操作也会花费相当长的时间。并且,许多长向量的操作尚未得到支持。

> sum(m)
Error: long vectors not supported yet:
    /home/mtmorgan/src/R-devel/src/include/Rinlinedfuns.h:100

因此,经常通过迭代较大文件来以较小的块处理数据是有意义的。这样可以完全使用R的例程,并允许并行评估(通过parallel包)。另一种策略是对数据进行下采样,这对统计学界的人不应该太具威慑性。


@Martin 并行评估可能不适用于所有的 R 函数。例如:glmnet。至少我并不知道是否可以对 glmnet 进行并行实现,而这正是我当前数据分析所需的。 - tan

6

你的矩阵元素数量超过了最大向量长度2^31-1。这是一个问题,因为矩阵只是带有dim属性的向量而已。read.csv能工作是因为它返回一个数据框(data.frame),它是一个向量列表。

R> 75713*44771 > 2^31-1
[1] TRUE

请参见?"内存限制"获取更多详细信息。


刚好比我快一步。我已经添加了在R中查找此信息的链接。 - mnel
@mnel:感谢您的编辑。我还添加了一些详细信息,解释了为什么read.csv可以工作而as.matrix不能。 - Joshua Ulrich
@JoshuaUlrich那是否意味着没有办法让R处理像我拥有的这么大的数据集? - tan
3
R的开发版本允许使用超过 2^31-1 大小的向量和矩阵(总大小,而非单个维度)。"处理数据集"暗示您需要输入所有数据,并将其表示为矩阵;但是可以在不使用这些东西的情况下进行有用的分析。 - Martin Morgan
@MartinMorgan:你能把那个作为答案并详细说明一下(或者展示一个例子),如何创建一个那么大的矩阵吗?或者它是开箱即用的吗? - Joshua Ulrich
@JoshuaUlrich 这是相当新的东西,请参阅 R Internals 手册和 NEWS 中的 R-devel。 - mdsumner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接