1

友達、

無向グラフで 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

4

0 に答える 0