8

テキストファイルからRに〜5x10 ^ 6の数値を読み取るのは、私のマシンでは比較的遅くなります(数秒、そのようなファイルをいくつか読み取ります)scan(..., what="numeric", nmax=5000)。この種のタスクのラッパーを試す価値はありますかRcpp(たとえばArmadillo、テキストファイルを読み取るためのユーティリティがいくつかあります)?または、予想されるインターフェイスオーバーヘッドのために、パフォーマンスがほとんどまたはまったく向上しないために時間を無駄にしている可能性がありますか?現在、速度を制限しているのは何か(固有のマシンパフォーマンスなど)はわかりません。これは、通常、1日に何度も繰り返すタスクであり、ファイル形式は常に同じで、1000列、約5000行です。

必要に応じて、試してみるサンプルファイルを次に示します。

nr <- 5000
nc <- 1000

m <- matrix(round(rnorm(nr*nc),3),nr=nr)

cat(m[1, -1], "\n", file = "test.txt") # first line is shorter
write.table(m[-1, ], file = "test.txt", append=TRUE,
            row.names = FALSE, col.names = FALSE)

更新:Armadilloを試しread.csv.sqlてみましたが、どちらもソリューションよりも低速でした。load("test.txt", arma::raw_ascii)scan

4

4 に答える 4

8

fread最新バージョンのをチェックアウトすることを強くお勧めしdata.tableます。CRAN(1.8.6)のバージョンはfread(この投稿の時点では)まだリリースされていないため、R-forgeの最新のソースからインストールすれば入手できるはずです。ここを参照してください。

于 2013-03-03T21:32:18.877 に答える
5

私はRの専門家ではありませんが、ここでも概念が当てはまる可能性があることに注意してください。通常、バイナリのものを読み取る方が、テキストファイルを読み取るよりもはるかに高速です。ソースファイルが頻繁に変更されない場合(たとえば、同じデータでさまざまなバージョンのスクリプト/プログラムを実行している場合)、scan()を使用してそれらを一度読み取り、バイナリ形式で保存してみてください(マニュアルには次の章があります。バイナリファイルのエクスポート)。そこから、バイナリ入力を読み取るようにプログラムを変更できます。

@Rcpp:scan()とその仲間は、ネイティブ実装(fscanf()など)を呼び出す可能性が高いため、Rcppを介して独自のファイル読み取り関数を記述しても、パフォーマンスが大幅に向上することはありません。それでも試してみることができます(そして特定のデータに合わせて最適化することもできます)。

于 2012-01-30T09:59:30.703 に答える
5

Salut Baptiste、

データ入出力は非常に大きなトピックであるため、Rにはデータ入出力に関する独自のマニュアルが付属しています。

Rの基本的な機能は非常に一般的であるため、遅くなる可能性があります。フォーマットがわかっている場合は、より高速なインポートアダプタを簡単に作成できます。寸法もわかっている場合は、必要なメモリ割り当てが1つだけなので、さらに簡単です。

編集: 最初の概算として、C++10ライナーを作成します。ファイルを開き、行を読み取り、トークンに分割し、vector<vector< double > >またはそのようなものに割り当てます。push_back()個々のベクター要素で使用する場合でもscan()、メチンクと競争する必要があります。

私はかつて、csv readerBrianKernighan自身によるコードに基づいたC++のすてきな小さなクラスを持っていました。かなり一般的(csvファイルの場合)、かなり強力です。

その後、必要に応じてパフォーマンスを絞ることができます。

さらなる編集:このSOの質問には、csvを読む場合の多くの指針と、カーニハンとプラウガーの本への参照があります。

于 2012-01-30T21:19:27.867 に答える
3

read.csvはい、ほぼ確実に/よりも高速なものを作成できますscan。ただし、高性能のファイル読み取りには、すでにはるかに高速に実行できる既存のトリックがいくつかあるため、実行することはすべてそれらと競合します。

Mathiasがほのめかしたように、ファイルがあまり頻繁に変更されない場合は、を呼び出してファイルをキャッシュし、を使用してsave復元できますloadascii = FALSE(バイナリファイルの読み取りが速くなるため、必ずを使用してください。)

次に、Gaborが述べたように、ファイルをデータベースに読み込んでから、そのデータベースからRに読み込むことで、パフォーマンスを大幅に向上させることができます。

第3に、HadoopStreamingパッケージを使用して、Hadoopのファイル読み取り機能を使用できます。

これらの手法の詳細については、Rのデータフレームとして非常に大きなテーブルをすばやく読み取るを参照してください。

于 2012-01-30T14:12:15.557 に答える