私は大きな問題を抱えています。より具体的な問題は、一度解決すればより大きな問題を解決できます。誰かが私に試してみるアイデアがあれば、本当に感謝しています。巨大な疎な行列をdata.tableに変換してより高速にサブセット化するR
基本的には、{slam}パッケージを使用して単純なトリプレットマトリックスとして保存され、実行している巨大な疎なマトリックス(約300k×150k、元はR's {tm}パッケージで作成されたTerm-Documentマトリックス)一連の用語をループし、それらの用語に基づいてサブセット化する関数です。残念ながら、サブセッティングプロセスは非常に遅いです。
より迅速にサブセット化する方法を見つけようとして、私はdata.tableパッケージを見つけました。このパッケージは、いくつかのテストでうまく実行されました。しかし、私はdata.tableに私のスパース行列を変換しようとすると、私は
Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA
In addition: Warning message:
In nr * nc : NAs produced by integer overflow
を取得する私は、技術的にはR用のベクターである、それは最初の標準行列に変換しようとするため、これがあることを理解します300k * 150kは.Machine$integer.max
よりもかなり上です。
私の質問:単純なトリプレット行列をdata.frameまたはdata.tableに変換する方法を知っている人は、最初に行列に変換せずに整数オーバーフローを避ける方法を知っていますか?
もしそうでなければ、誰かが別の回避策を持っていますか、またはb)巨大な疎行列および/または単純な三重行列を素早くサブセット化するための助言がありますか?
以下は、周囲を混乱させる再現可能な例です。私のマシンでは、最初の10行のそれぞれを部分集合とするループは約3秒かかります。数十万行に及ぶループに入ると、すぐに禁止されます。助けを事前に感謝:
require(slam)
STM <- simple_triplet_matrix(i = as.integer(runif(10000000,1,300000)),
j = as.integer(runif(10000000,1,150000)),
v = rep(rnorm(10), 1000000),
nrow = 300000,
ncol = 150000)
start <- Sys.time()
for (i in 1:10) {
vec <- as.matrix(STM[,i])
}
Sys.time() - start
追記:あなたはSTMm <- as.matrix(STM)
を試す場合は、私が上記示した同じオーバーフローエラーを取得していることに気づきます。
ほとんど瞬間的です最初の2列の非ゼロ要素の座標と3列目の値を含むベクトル。可能なアプローチ(私はそれをテストしませんでした)は、3つのベクトルのリストとしてC++にトリプレットを渡して、C++でサブセット化アルゴリズムを書くためにRCppパッケージを使うことです。 Rでできることは何でもできるはずです – dww