54

read.table が大きなデータファイルに対して効率的でない方法について読んでいます。また、R が大規模なデータセットに適していないことについても説明します。そのため、(1) さまざまなサイズのデータ​​を読み取る (2) さまざまなサイズのデータ​​を操作するための実用的な制限とパフォーマンス チャートはどこで見つけることができるのだろうかと考えていました。

つまり、いつパフォーマンスが低下したのか、いつ障害物にぶつかったのかを知りたいのです。また、C++/MATLAB または他の言語との比較も非常に役立ちます。最後に、Rcpp と RInside の特別なパフォーマンス比較があれば、それは素晴らしいことです!

4

5 に答える 5

53

R大規模なデータ セットに適していますが、入門用の教科書で教えられている方法から多少変更する必要がある場合があります。30 GB のデータ セットをクランチするBig Data for Rに関する投稿を行いました。これはインスピレーションに役立つかもしれません。

開始するための通常の情報源は、High-Performance Computing Task Viewおよび R-SIG HPC のR -SIG HPC メーリング リストです。

回避しなければならない主な制限は、ベクトルの長さの 2^31-1 要素までの歴史的な制限です。これは、R が行列をベクトルとして格納しなければ、それほど悪くはありません。(制限は、一部の BLAS ライブラリとの互換性のためです。)

R を使用して、数百万人の顧客の電話会社の通話データ レコードとマーケティング データベースを定期的に分析しています。

于 2011-03-08T15:07:31.403 に答える
33

物理的な制限は、ベクトルで 32 ビット インデックスを使用することから生じます。その結果、2^31 - 1 までのベクトルが許可されます。行列は次元を持つベクトルであるため、 と の積は2^31 - 1 以内nrow(mat)ncol(mat)なければなりません。データ フレームとリストは一般的なベクトルであるため、各コンポーネントは 2^31 - 1 エントリを取ることができます。行列。リストの場合、それぞれ 2^31 - 1 要素の 2^31 - 1 コンポーネントを持つことができます。これは、R-Help の Q に対する Duncan Murdochの最近の投稿から抜粋したものです。

すべてが標準の R で RAM に収まる必要があるため、より差し迫った制限になる可能性がありますが、他の人が言及したハイパフォーマンス コンピューティングタスク ビューには、メモリ内の問題を回避できるパッケージの詳細が含まれています。

于 2011-03-08T15:11:07.120 に答える
14

1) R のインポート/エクスポート マニュアルは、データのインポートに関する質問の最初の窓口となる必要があります。多くのオプションがあり、何が機能するかは非常に具体的です。

http://cran.r-project.org/doc/manuals/R-data.html

read.table提供されたオプション、特にcolClassescomment.char、およびnrows- を使用すると、パフォーマンスが大幅に向上します。これは、この情報をデータ自体から推測する必要があり、コストがかかる可能性があるためです。

2) data.frame、またはリスト内のベクトル、行列、配列、列の長さ (要素の総数) には特定の制限があります。これは、内部で使用される 32 ビット インデックスによるもので、32 ビットおよび 64 ビット R に当てはまります。数値は 2^31 - 1 です。これは、data.frame の行の最大数ですが、非常に大きいため、複数のベクトルの収集を開始する前に、1 つのベクトルでもメモリ不足になる可能性がはるかに高くなります。

詳細についてはhelp(Memory-limits)、 とhelp(Memory)を参照してください。

その長さの単一のベクトルは何ギガバイトものメモリを必要とするため (各ベクトルの型とストレージ モードに依存します - 数値の場合は 17.1)、実際に物事を推し進めていない限り、適切な制限になる可能性は低いです。利用可能なシステム メモリ (ここでは 64 ビットが必須) を超えて物事をプッシュする必要がある場合は、インポート/エクスポート マニュアルで説明されている標準的なデータベース手法、またはメモリ マップ ファイル オプション (ffパッケージなど) を検討する価値があります。CRAN タスク ビュー ハイ パフォーマンス コンピューティングは、この目的のための優れたリソースです。

最後に、RAM のスタック (16Gb 以上) があり、64 ビットのインデックス作成が必要な場合は、R の将来のリリースで提供される可能性があります。http://www.mail-archive.com/r-help@r-project.org /msg92035.html

また、Ross Ihaka は、R に似た言語の歴史的な決定と将来の方向性について、次の論文や講演で議論しています: http://www.stat.auckland.ac.nz/~ihaka/?Papers_and_Talks

于 2011-03-08T15:12:53.540 に答える
8

大きな csv ファイルを読み取るときは、(バージョン 1.8.7 の時点で) 実行できる最も簡単な方法だx GB <=> y.1e6 rowsと思いますdata.table::freadinstall.packages("data.table", repos="http://R-Forge.R-project.org")

通常は 5 ~ 10 倍になります (すべてsepなどrow.namesは関数自体によって処理されます)。多くのファイルと適切なコンピューター (複数のコア) がある場合は、parallel(R.2.14 の一部として) パッケージを使用して、コアごとに 1 つのファイルを読み込むことをお勧めします。

前回read.csv、4 コアを使用したモノスレッド読み込みとマルチスレッド読み込みの間でこれfreadを行ったとき、5 分から 20 秒になりました

于 2013-02-26T21:01:45.713 に答える
8

read.table大規模なデータ セットの経験がないため、についてのみ回答できます。read.table引数を指定しないとパフォーマンスが低下しcolClassesます。それがないと、read.tableデフォルトNAですべての列のクラスを推測しようとしますが、特に列が多い場合は遅くなる可能性があります。

于 2011-03-08T15:01:20.890 に答える