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 - 大数据 - 向量超出向量长度限制的主要内容,如果未能解决你的问题,请参考以下文章