[解決済み] 非常に大きなテーブルをデータフレームとして高速に読み込む
質問
非常に大きなテーブル(3000万行)があり、Rでデータフレームとして読み込みたいのですが、どうすればよいですか?
read.table()
は便利な機能が多いのですが、実装にロジックが多く、遅くなるような気がします。 私の場合、カラムの型が先に分かっていること、テーブルにカラムヘッダや行名が含まれていないこと、気になるような病的な文字がないことを前提に考えています。
を使用してテーブルをリストとして読み込むことは知っています。
scan()
はかなり高速になります、例.
datalist <- scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0)))
しかし、これをデータフレームに変換しようとすると、上記のパフォーマンスが6分の1に低下するように見えるものがあります。
df <- as.data.frame(scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0))))
もっと良い方法はないのでしょうか? あるいは、まったく別のアプローチで問題を解決できる可能性はありませんか?
解決方法は?
数年後のアップデート
この回答は古く、Rは前進しました。 手直し
read.table
を使っても、ほとんど効果はありません。 あなたの選択肢は
-
使用方法
vroom
tidyverseパッケージからvroom
csv/tab区切りファイルからRのtibbleに直接データをインポートするためのものです。参照 Hectorの回答 . -
使用方法
fread
でdata.table
は、csv/tab-delimited ファイルから直接Rにデータをインポートするためのものです。 mnelの回答 . -
使用方法
read_table
でreadr
(2015年4月よりCRANにて)。 これは、以下のように動作します。fread
上記の また リードミー の2つの関数の違いについて、リンク先で説明しています(readr
と比べて1.5~2倍遅いと言っています。data.table::fread
). -
read.csv.raw
からiotools
は、CSVファイルを素早く読み込むための第3の選択肢を提供します。 -
できるだけ多くのデータをフラットファイルではなく、データベースに保存しようとすること。 (永久保存媒体として優れているだけでなく、データはバイナリ形式でRとの間で受け渡しされるため、より高速になります)。
read.csv.sql
の中にsqldf
パッケージで説明されているように JD Longの回答 は、データを一時的な SQLite データベースにインポートし、それを R に読み込みます。RODBC
パッケージの逆依存セクションとDBI
パッケージ のページをご覧ください。MonetDB.R
は、データフレームのように見せかけて、実はその下はMonetDBであるというデータ型を与え、パフォーマンスを向上させます。 データをインポートするにはmonetdb.read.csv
関数を使用します。dplyr
は、いくつかのタイプのデータベースに保存されたデータを直接操作することができます。 -
また、バイナリ形式でデータを保存すると、パフォーマンスの向上に役立つことがあります。 使用方法
saveRDS
/readRDS
(後述)を使用するとh5
またはrhdf5
HDF5 形式のパッケージ、またはwrite_fst
/read_fst
からfst
パッケージを使用します。
回答原文
read.tableを使うにせよscanを使うにせよ、試してみるべき簡単なことが2つあります。
-
セット
nrows
= データ内のレコード数 (nmax
でscan
). -
を確認してください。
comment.char=""
をクリックすると、コメントの解釈をオフにすることができます。 -
各カラムのクラスを明示的に定義するには
colClasses
でread.table
. -
設定方法
multi.line=FALSE
は、スキャン時のパフォーマンスも向上させることができます。
もし、どれもうまくいかない場合は、次のいずれかを使ってください。
プロファイリング・パッケージ
どの行が処理を遅くしているのかを判断するためです。 おそらく
read.table
その結果をもとに
もう一つの方法は、Rに読み込む前にデータをフィルタリングすることです。
あるいは、定期的に読み込まなければならないことが問題なのであれば、これらの方法を使って一度だけデータを読み込み、データフレームをバイナリブロブとして保存し
save
saveRDS
を使えば、次回からはより速く取得することができます。
load
readRDS
.
関連
-
Rの警告 "条件の長さが1より大きいので、最初の要素しか使えない "に対する解決策
-
R言語 - マトリックス
-
[解決済み] データフレーム列の名前によるドロップ
-
[解決済み] ggplot2 の軸ラベルを回転させ、間隔を空ける
-
[解決済み] リストやデータフレームの要素にアクセスするためのブラケット[ ]とダブルブラケット[[ ]]の違いについて
-
[解決済み] PandasとPythonでCSVファイルを読み込むとUnicodeDecodeErrorが発生する。
-
[解決済み】pandasでdataframeをループする最も効率的な方法は何ですか?
-
[解決済み】大きなMS SQLの.sqlファイルをインポートする方法は?
-
[解決済み】インデックスで2つのデータフレームをマージする
-
[解決済み] [Solved] data.frameのカラムをベクトルに変換する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
R - よくあるエラーとその原因 - 注意事項
-
R - ユークリッド距離の計算を簡単にする方法
-
R言語 - マトリックス
-
[解決済み] lm.fit(x,y,offset = offset, singular.ok,...) 0 非NAケースでboxcox式で計算するとエラーになる。
-
[解決済み] 文字列ベクトルを代入して、列名を持つ空のデータフレームを作成する?重複
-
[解決済み] Rの再現性のある優れた例題の作り方
-
[解決済み] データフレームを結合(マージ)する方法(内側、外側、左側、右側)
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] ggplot2 Rプロットで軸の制限を設定するには?
-
[解決済み] 2つの単語の最初の文字を大文字にします。