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

Posted

技术标签:

【中文标题】R - 大数据 - 向量超出向量长度限制【英文标题】:R - Big Data - vector exceeds vector length limit 【发布时间】:2012-08-07 23:03:27 【问题描述】:

我有以下 R 代码:

data <- read.csv('testfile.data', header = T)
mat = as.matrix(data)

我的 testfile.data 的更多统计数据:

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

因为这是一个大型数据集,所以我使用的是 Amazon EC2 和 64GB 内存空间。所以希望内存不是问题。我能够加载数据(第一行有效)。 但是 as.matrix 转换(第 2 行错误)会抛出以下错误:

resulting vector exceeds vector length limit in 'AnswerType'

任何线索可能是什么问题?

【问题讨论】:

【参考方案1】:

如前所述,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 例程的完全访问权限,并允许并行评估(通过并行包)。另一种策略是对数据进行下采样,这对统计受众来说应该不会太吓人。

【讨论】:

@Martin 并行评估可能不适用于所有 R 函数。示例:glmnet。至少我不知道 glmnet 是否可以并行实现,而这正是我当前数据分析所需要的【参考方案2】:

您的矩阵包含的元素多于最大向量长度 2^31-1。这是一个问题,因为矩阵只是具有dim 属性的向量。 read.csv 之所以有效,是因为它返回一个 data.frame,它是一个向量列表。

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

更多详情请见?"Memory-limits"

【讨论】:

只要打败我就行了。我添加了在 R 中查找此信息的链接。 @mnel:感谢您的编辑。我还添加了一些关于为什么 read.csv 有效但 as.matrix 无效的详细信息。 @JoshuaUlrich 那么这是否意味着没有办法让 R 处理与我拥有的数据集一样大的数据集? R 的开发版本允许大于 2^31-1 的向量和矩阵(总大小,而不是单个维度)。 “处理数据集”意味着您必须输入所有数据,并且必须将其表示为矩阵;没有任何一个也可以进行有用的分析。 @MartinMorgan:您能否将其添加为答案并详细说明(或显示示例)如何创建这么大的矩阵?还是开箱即用支持?

以上是关于R - 大数据 - 向量超出向量长度限制的主要内容,如果未能解决你的问题,请参考以下文章

Rcpp R 向量大小限制(不允许负长度向量)

——R的数据组织

——R的数据组织

使用R语言将不同长度的向量合并为数据框

如何在 C++ 中比较两个大向量的大小

技多不压身:支持向量机在 R 语言中的实现和使用