問題タブ [r-bigmemory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - Rでbigmemory::big.matrixオブジェクトを保存してロードするにはどうすればよいですか?
R コードで big.matrix オブジェクトを使用しようとしていますが、 を使用してそれらをファイルに保存するのに問題がありますsaveRDS
。これは通常、オブジェクトを保存する方法です。
saveRDS は、 big.matrix オブジェクトが実際には他のメモリへのポインターであり、事実上ポインターを保存しているだけであることを何らかの形で認識できていないと思います。これを回避する方法はありますか?
(実際に保存したいオブジェクトは、1 つ以上の big.matrix オブジェクトを含む複雑なデータ構造であるため、ファイルに基づく big.matrix オブジェクトは実際には使用したくありません。そのため、big.matrix オブジェクトごとにバッキング ファイルが必要になります。 .matrix がオブジェクトに含まれている場合、オブジェクトは 1 つではなく、不確定な数のファイルにシリアル化されます。)
r - 大きなマトリックスを作成しようとすると R がクラッシュする
いくつかのデータを挿入して変換した後、ネットワーク オブジェクトに変換するために、0 の大きなマトリックスを作成しようとしています。私が使用しているデータは、ユーザー ID とその友達の ID のリストです。ここ [ http://www.shizukalab.com/toolkits/sna/sna_data ]で見つけたコードを使用して、ユーザーと友人の間のつながりを 1 に変換しています。その後、 と を使用statnet
しigraph
てデータを分析できます。R セッションが中断し続けるというデータの次元に基づいてマトリックスを作成しようとすると、問題が発生します。
問題はメモリやシステムの問題ではなく、データの問題であると考えているため、具体的に説明するために、プロセス全体を示します。
そこで、最初にデータをサブセット化して、ユーザー ID とその友達の 2 つの列を作成しました。次に、それを折りたたんでそこから txt ファイルを作成し、それをメモリにスキャンしました。
dat
これは、次のように見えるもののスニペットです。
次に、長さを読み込んでdat
次元を確立し、行列を作成しようとします。Rstudio は長時間実行され、その後クラッシュします。
繰り返しますが、メモリやシステムの問題ではないと思います。他の StackOverflow の議論に基づいて、私はbigmemory
パッケージを使用しており、4 つのコアのうち 3 つを実行しています。これは の一部で、sessionInfo
16GB の RAM を搭載しています。数週間前にアップグレードしたばかりの Rstudio v. 0.99.486 も実行しています。
私は最も高度な R ユーザーではないので、明らかなことを見落としている可能性があります。どんな考えでも大歓迎です。
r - Rでbig.matrixを使用してクロス検証を効率的に行うには?
次のように、X
クラス型big.matrix
を入力として設計行列を取り、応答を予測する関数があります。
注:マトリックスのサイズはX
10 GB を超えています。そのため、メモリにロードできません。以前read.big.matrix()
はバッキング ファイルX.bin
とX.desc
.
私の質問は、この巨大な big.matrix でクロス検証を効率的に行うにはどうすればよいかということです。
私の試み: (動作しますが、時間がかかります。)
- ステップ 1:フォールドごと
idx.train
に、トレーニングとテストのインデックスを取得しますidx.test
。 - ステップ 2: と に分割し
X
ます。とも非常に大きいため、それらを として保存し、各 foldのトレーニング セットとテスト セット用に関連するバッキング ファイル ( 、 ) を作成する必要があります。X.train
X.test
X.train
X.test
big.matrix
.bin
.desc
- ステップ 3: をフィードし
X.train
てモデルを構築し、 の応答を予測しX.test
ます。
時間のかかる部分はステップ 2で、トレーニングとテスト用のバッキング ファイルを何度も作成する必要があります (元の大きな行列をコピーして貼り付けるのとほとんど同じです)。たとえば、10 分割の交差検証を行うとします。ステップ 2 では、10 個のフォールドすべてのバッキング ファイルを作成するのに 30 分以上かかります。
ステップ 2 でこの問題を解決するには、元の行列を (クラス type の) 10 個の部分行列に一度だけ分割できると思いますbig.matrix
。次に、フォールドごとに 1 つの部分をテスト用に使用し、残りの 9 つの部分をトレーニング用の 1 つの大きなマトリックスとして結合します。しかし、新しい問題は、big.matrix
コピー/貼り付けなしで小さいものをより大きなものに効率的に結合する方法がないことです。
もちろん、この相互検証手順のために分散コンピューティングを実行できます。しかし、単一のコアを使用するだけで、手順を高速化するより良い方法があるかどうか疑問に思っています.
何か案は?前もって感謝します。
アップデート:
X
が非常に大きい場合、@cdeterman の回答は機能しないことが判明しました。その理由は、mpermute()
関数が本質的にコピー/貼り付けを行うことによって行を並べ替えるためです。C++ でmpermute()
呼び出し、次に関数を呼び出します。この関数は、すべての列と行をループしてコピー/貼り付けを行うことにより、マトリックスを並べ替えます。ソースコードはこちらをご覧ください。ReorderRNumericMatrix()
reorder_matrix()
私の問題を解決するためのより良いアイデアはありますか?? ありがとう。
更新を終了
r - Rのbigmemoryパッケージを使用してデータが欠落している大きなcsvファイルを読み取る
私は研究に大規模なデータセット (4.72GB) を使用していますが、大規模なデータセット (最大 10GB の範囲) を処理すると思われる R の「bigmemory」パッケージを発見しました。ただし、read.big.matrix を使用して csv ファイルを読み取ると、次のエラーが発生します。
問題は、csv ファイルがいっぱいではないことだと思います。つまり、いくつかのセルに値がありません。header = TRUE を削除しようとしましたが、R はセッションを中止して再起動します。
read.big.matrix を使用してデータが欠落している大きな csv ファイルを読み取った経験のある人はいますか?
r - R での big.matrix を使用した交差検証のための並列計算
mclapply
非常に大きな計画行列X
(〜10GB)と応答ベクトルのフィッティング手順をモデル化するための交差検証を並列化するために使用しようとしていますy
。X
次元がn-by-p
:であるとしましょうn=1000, p=1,000,000
。X
は非常に巨大であるため、オブジェクトとしてバックアップさbig.matrix
れ、ディスクに格納され、R パッケージのメソッドを使用してアクセスされますbigmemory
。
4 分割クロス検証のワークフローは次のとおりです。
cv.ind
長さ のインデックス ベクトルを設定しますn
。これは 1 ~ 4 の一連の数値を格納し、 のどの観測値がX
CV のどのフォールドに属するかを示します。- 4 コアをセットアップします。i 番目のコアで、i 番目のフォールド CV の対応するトレーニングおよびテスト サブマトリックスをコピーします。
- 各コアの折り目ごとにモデルを当てはめます。
- 結果を収集し、返します。
交差検証関数は次のようになります。
R 関数cvf
は各コアで実行されます。i 番目のフォールドのトレーニング/テスト行列を 2 つのbig.matrix
オブジェクトとしてコピーし、モデルに適合させ、いくつかの統計を計算し、結果を返します。
ここまでは、計画行列X
が大きすぎない場合 (n=1000, p=100,000
サイズが ~1GB の場合)、コードは非常にうまく機能します。しかし、p=1,000,000
それによって のサイズX
が ~10GB になると、各コアでのモデル フィッティング手順が無限に実行されます!!!!! (次の部分):
注:
- 生のマトリックス (10GB) で 'ncvreg()' を 1 回実行すると、約 2.5 分かかります。
for
ループではなくループを使用してクロス検証を順次実行するmclapply
と、コードは正常に機能し、各フォールド 'ncvreg()' のモデル フィッティングも正常に機能します (~2 分) が、プロセス全体には ~25 分かかります。- 最初は同じ問題で「parLapply」を試しました。ここの理由により、「mclapply」に切り替えました。
- 各コアのデータ コピー ステップ (
deepcopy
部分) は適切に機能し、トレーニング データ セットとテスト データ セットをディスクにコピーしてファイルでバックアップするのに約 2 分かかります。 - CPU 使用率を監視しようとしました。以下は 1 つのスクリーンショットです。左の図でわかるように、4 つのセッションのそれぞれが最大 25% の CPU 使用率を占めていますが、1 つのプロセスでは、kernel_taskが最大 100% の CPU を使用しています。時間が経過すると、kernel_taskは 150% の CPU を使用することさえあります。さらに、CPU 履歴パネル (右下) は、赤色の領域が緑色の領域を支配しているため、ほとんどの CPU 使用率がユーザーではなくシステムによるものであることを示しています。
私の質問:
- モデル フィッティング プロセスを並列に実行すると、時間がかかるのはなぜですか? 考えられる理由は何ですか?
- big.matrix の CV 手順を並列化する正しい方向に進んでいますか? 別の方法はありますか?
ここで私の問題を解決するのに役立つ洞察に感謝します。前もって感謝します!!
r - 大きなマトリックスとメモリの問題
私は巨大なデータセットに取り組んでおり、テスト統計の分布を導出したいと考えています。したがって、巨大な行列 (200000x200000) で計算を行う必要があり、ご想像のとおり、メモリの問題があります。より正確には、次のようになります。 エラー: サイズのベクトルを割り当てられません ... Gb。私は 64 ビット版の R を使用しており、RAM は 8Gb です。パッケージ bigmemory を使用しようとしましたが、大きな成功はありませんでした。
最初の問題は、距離行列を計算する必要がある場合です。データフレームの列の距離を並列に計算する Dist という amap パッケージでこの素晴らしい関数を見つけましたが、うまく機能しますが、下/上三角が生成されます。行列の乗算を実行するには距離行列が必要ですが、残念ながら行列の半分ではできません。as.matrix 関数を使用していっぱいにすると、再びメモリの問題が発生します。
だから私の質問は、 as.matrix ステップをスキップして dist オブジェクトを big.matrix に変換する方法です。Rccp に関する質問かもしれませんが、私は Rccp の初心者であることを覚えておいてください。
事前にサンクス!