我一直在阅读read.table如何对大数据文件无效.R也不适用于大型数据集.所以我想知道在哪里可以找到实际限制和任何性能图表(1)读取各种尺寸的数据(2)处理不同大小的数据.
实际上,我想知道性能何时恶化以及何时遇到路障.对C++/MATLAB或其他语言的任何比较都会非常有用.最后如果Rcpp和RInside有任何特殊的性能比较,那就太棒了!
我有一个包含多个社交媒体用户和他/她的粉丝的数据表.原始数据表格式如下:
X.USERID FOLLOWERS
1081 4053807021,2476584389,4713715543, ...
Run Code Online (Sandbox Code Playgroud)
因此,每行包含一个用户以及他/她的ID和一个关注者矢量(用逗号分隔).总共有24,000个唯一身份用户ID和160,000,000个独立粉丝.我希望以下列格式转换原始表:
X.USERID FOLLOWERS
1: 1081 4053807021
2: 1081 2476584389
3: 1081 4713715543
4: 1081 580410695
5: 1081 4827723557
6: 1081 704326016165142528
Run Code Online (Sandbox Code Playgroud)
为了获得这个数据表,我使用了以下代码行(假设我的原始数据表被称为dt):
uf <- dt[,list(FOLLOWERS = unlist(strsplit(x = FOLLOWERS, split= ','))), by = X.USERID]
Run Code Online (Sandbox Code Playgroud)
但是,当我在整个数据集上运行此代码时,我收到以下错误:
不允许负长度向量
根据这篇关于堆栈溢出的帖子(不正确使用set后data.table中的行数为负数),似乎我碰到了data.table中列的内存限制.作为一种解决方法,我以较小的块(每10,000个)运行代码,这似乎有效.
我的问题是:如果我改变我的代码,我可以防止这个错误发生或我是否碰到R的限制?
PS.我有一台140GB RAM的机器,所以物理内存空间应该不是问题.
> memory.limit()
[1] 147446
Run Code Online (Sandbox Code Playgroud) 我想根据这里推荐的代码创建一个共现矩阵(另见下文)。它适用于我使用的大多数数据帧。但是,如果我使用data.table::melt...
negative length vectors are not allowed
...或稍后使用 base::crossprod
error in crossprod: attempt to make a table with >=2^31 elements
两者都与数据帧的大小有关。在第一种情况下,它与行数有关,而在后一种情况下,矩阵的大小超过了限制。
我知道关于第一个问题(解决方案data.table::melt)提出的[2] ,[3]和[4] ,以及对于第二个问题(base::crossprod通过)[5]和[6] ,和我见过[ 7]但我不确定如何使它们适合我的情况。我试图按 ID 将数据帧拆分为几个数据帧,合并它们并计算共现矩阵,但我刚刚产生了额外的错误消息(例如,无法分配大小为 17.8 GB 的向量)。
我有一个由plyr::join它创建的组装数据框,看起来像这样(但是,当然,要大得多):
df <- data.frame(ID = c(1,2,3,20000),
C1 = c("England", "England", "England", "China"),
C2 = c("England", "China", "China", "England"),
C5850 = c("England", "China", "China", "England"),
SC1 = c("FOO", "BAR", "EAT", …Run Code Online (Sandbox Code Playgroud) 根据/sf/answers/3407347261/和/sf/answers/366400541/ R 向量仅限于 2^31 - 1 项。但是,我已经能够通过 Rcpp 在该数字的一半处触发“不允许负长度向量”错误(这应该是尝试分配过大向量的标志)。这一切都来自我尝试调试基于 Rcpp 的 R 包(https://github.com/tpq/propr/issues/13)。
library(Rcpp)
cppFunction("
IntegerVector test(int size) {
int veclen = size * (size - 1) / 2;
IntegerVector vec(veclen);
return vec;
}
")
vec <- test(47000)
Error in test(47000) : negative length vectors are not allowed
Run Code Online (Sandbox Code Playgroud)
47000^2 / 2 几乎是 2^31 的一半。我在纯 R 中没有遇到这样的问题,vec <- 1:(47000*(47000-1)/2)运行得很好,所以 Rcpp 应该有一些特别的东西。