web-dev-qa-db-ja.com

Rデータフレームの実用的な制限

Read.tableが大きなデータファイルに対して効率的でないことについて読んでいます。また、Rが大規模なデータセットに適さない理由。だから、実際の制限とは何か、(1)さまざまなサイズのデータ​​を読み込む(2)さまざまなサイズのデータ​​を操作するためのパフォーマンスチャートをどこで見つけることができるのかと思っていました。

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

49
Egon

Risは大規模なデータセットに適していますが、導入の教科書で教えられているものとは多少異なる方法で作業する必要があります。 Rのビッグデータ で投稿しました。これは30 GBのデータセットを処理し、インスピレーションに役立つことがあります。

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

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

Rを使用している数百万の顧客との電話会社の通話データレコードおよびマーケティングデータベースを定期的に分析しているので、興味があればお気軽にお問い合わせください。

50

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

これで、すべてがRAMで標準Rに収まる必要があるため、より差し迫った制限になる可能性がありますが、 High-Performance Computing Task Viewメモリ内の問題を回避できるパッケージの詳細が記載されている人もいます。

29
Gavin Simpson

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

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

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

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

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

その長さの単一のベクトルは、多くのギガバイトのメモリ(各ベクトルのタイプとストレージモード-数値の場合は17.1に依存)を必要とするため、実際にプッシュしない限り、適切な制限になりそうにありません。本当に使用可能なシステムメモリ(ここでは64ビットが必須)を超えてプッシュする必要がある場合は、インポート/エクスポートマニュアルで説明されている標準のデータベーステクニック、またはメモリマップファイルオプション(ffパッケージなど) 、検討する価値があります。 CRAN Task View High Performance Computingは、このような目的を達成するための優れたリソースです。

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

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

13
mdsumner

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

8
aL3xa

大きなcsvファイルを読み取るとき_x GB <=> y.1e6 rows_ _data.table::fread_(バージョン1.8.7以降)を使用すると、install.packages("data.table", repos="http://R-Forge.R-project.org")

通常、5〜10倍になります(すべてのsep、_row.names_などは関数自体によって処理されます)。多くのファイルと十分なコンピューター(いくつかのコア)がある場合は、parallelパッケージ(R.2.14の一部として)を使用して、コアごとに1つのファイルをロードすることをお勧めします。

前回、_read.csv_でのモノスレッドロードとfreadの4コア使用でのマルチスレッドロードの間でこれを行いました。5分から20秒になりました

7
statquant