Read.tableが大きなデータファイルに対して効率的でないことについて読んでいます。また、Rが大規模なデータセットに適さない理由。だから、実際の制限とは何か、(1)さまざまなサイズのデータを読み込む(2)さまざまなサイズのデータを操作するためのパフォーマンスチャートをどこで見つけることができるのかと思っていました。
実際には、パフォーマンスが低下したときと、障害になったときを知りたいです。また、C++/MATLABまたは他の言語との比較も非常に役立ちます。最後に、RcppとRInsideの特別なパフォーマンス比較がある場合、それは素晴らしいことです!
Risは大規模なデータセットに適していますが、導入の教科書で教えられているものとは多少異なる方法で作業する必要があります。 Rのビッグデータ で投稿しました。これは30 GBのデータセットを処理し、インスピレーションに役立つことがあります。
始めるための情報の通常のソースは High-Performance Computing Task View および R-SIG HPC のR-SIG HPCメーリングリストです。
回避しなければならない主な制限は、ベクトルの長さを2 ^ 31-1要素に制限する歴史的な制限です。これは、Rがベクトルとして行列を格納しなければそれほど悪くはありません。 (制限は、一部のBLASライブラリとの互換性のためです。)
Rを使用している数百万の顧客との電話会社の通話データレコードおよびマーケティングデータベースを定期的に分析しているので、興味があればお気軽にお問い合わせください。
物理的な制限は、ベクターでの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メモリ内の問題を回避できるパッケージの詳細が記載されている人もいます。
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
大規模なデータセットの経験がないため、read.table
についてのみ回答できます。 colClasses
引数を指定しないと、read.table
のパフォーマンスが低下します。これがないと、read.table
はNA
にデフォルト設定され、すべての列のクラスを推測しようとします。これは、特に列が多い場合は遅くなる可能性があります。
大きな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秒になりました