2013-08-14 24 views
9

大きなファイル(11GB +)から特定の行を読み込むのにどれくらい時間がかかるかに驚いています。例:大きなファイルから特定の行を効率的に読み込むR

> t0 = Sys.time() 
> read.table('data.csv', skip=5000000, nrows=1, sep=',') 
     V1  V2 V3 V4 V5 V6 V7 
1 19.062 56.71047 1 16 8 2006 56281 
> print(Sys.time() - t0) 
Time difference of 49.68314 secs 

OSX端末は特定の行を瞬時に返すことができます。誰でもRでより効率的な方法を知っていますか?

+5

し、それらを捨て、実際にラインを解析し、Rに読み込む 'readLines(ファイル、スキップ)'を呼び出しますread.table' 'ので、それは非効率的です。もっと効率的になるためには、十分な改行が見えるようになるまで(そして、バッファリングを速くするために適切に使用する必要がある)まで、接続を通して 'seek()' dするCコードを正しく書かなければならないと思う。 – hadley

答えて

18

さてあなたは、他のシェルツールで抽出したばかりの行を読み取るために、この

dat <- read.table(pipe("sed -n -e'5000001p' data.csv"), sep=',') 

のようなものを使用することができます。

system.time(someOps)は時間を測定する簡単な方法であることに注意してください。

+0

Thanks Dirk。この式は私のために働いています: 'dat < - read.table(pipe(" sed '5000000q; d' data.csv ")、sep = '、')' – geotheory

+0

または範囲: 'read.table(pipe sed -n '5000010q; 5000000,5000010p' data.csv ")、sep = '、')' – geotheory

+0

申し訳ありませんが、住所の後ろに 'p'がありません。今修正されました。範囲を知っていれば、sedとawkの両方が多数の選択肢を削除します。 –