友達、
無向グラフで igraphs shortest.paths を使用して研究者間の距離行列を計算すると、80GB の行列が得られました。次のステップは、マトリックスの上三角を溶かすことです。このタイプのマトリックスを 16 の異なるグラフで定義する必要があります。
マトリックスで操作 (data.table::melt、lower.triangle <- NA または is.infinite <- NA) を実行しようとすると、「ベクトルを割り当てることができません...」というエラーが発生しました。 244GiB RAM を搭載した Amazon AWS r3.8xlarge。
私がテストした戦略:
マトリックスの分割とサブマトリックスの溶解: 時間がかかりすぎる (マトリックスごとに 2 日) か、並列にするとメモリが消費される
big.matrix への変換: 時間がかかりすぎる (マトリックスごとに 1 日)
必要なメモリが 2 ~ 3 倍ある場合でもエラーが発生する理由はありますか?このサイズのデータセットに使用する戦略は?
よろしくお願いします!
セッション情報:
ami-b1b0c3c2 ( http://www.louisaslett.com/RStudio_AMI/から)
RStudio 0.99.903
R 3.3.1
r3.8xlarge - インスタンス
私のコード (df_Network には AuthorID と ArticleID の 2 つの列があります):
# Calculate dist.matrix
A <- spMatrix(nrow=length(unique(df_Network$AuthorID)),
ncol=length(unique(df_Network$Articleid)),
i = as.numeric(factor(df_Network$AuthorID)),
j = as.numeric(factor(df_Network$Articleid)),
x = rep(1, length(as.numeric(df_Network$AuthorID))) )
row.names(A) <- levels(factor(df_Network$AuthorID))
colnames(A) <- levels(factor(df_Network$id))
Arow <- tcrossprod(A)
# Calculate weighted relations
g1_weighted <- graph.adjacency(Arow, weight = T)
# Simplify graph to remove self loops and multiples
E(g1_weighted)$weight <- count.multiple(g1_weighted)
g1_weighted <- simplify(g1_weighted)
distMatrix_weighted <- shortest.paths(g1_weighted, v=V(g1_weighted), to=V(g1_weighted))
# 1st option: melt Matrix (R crashes with each of the lines)
distMatrix_weighted[upper.tri(distMatrix_weighted)] <- NA
distMatrix_weighted[is.infinite(distMatrix_weighted)] <- NA
A_weighted <- data.table::melt(distMatrix_weighted, na.rm = T)
# 2nd option: split Matrix, only take upper triangle and manually built data.table in parallel (Takes 2 days to run as I cannot take too many in parallel due to memory, too expensive to run on AWS as I am just a student)
AllData <- foreach(j=2:(ncol(distMatrix_weighted)-1), .combine=function(x,y)rbindlist(list(x,y)), .inorder=FALSE) %do%{
B <- data.table(Var1 = colnames(distMatrix_weighted)[j],
Var2 = rownames(distMatrix_weighted)[1:j-1],
value = distMatrix_weighted[1:(j-1), j] )
B[!is.infinite(value) & value >0]
}
# 3rd option: split Matrix and run dt.melt in parallel (Takes too long as I cannot take too many in parallel due to memory)
sequence <- seq(1,ncol(distMatrix_weighted), 100)
AllData <- foreach(j=1:(length(sequence)-1), .combine=function(x,y)rbindlist(list(x,y)), .inorder=FALSE) %do%{
m <- distMatrix_weighted[sequence[j]:sequence[j+1],]
m[!is.finite(m)] <- NA
data.table::melt(m, na.rm =T)
}
# 4th option: bigmemory package to store and then run multiple in parallel. Conversion to big.matrix is running since one day with no output
distMatrix_weighted <- as.big.matrix(distMatrix_weighted)
...
サンプル データへのリンク: https://www.dropbox.com/s/eaud2np33e5y6iv/df_network_2000-2005.RData?dl=0