12

data.table fread 関数を使用して読み取ることができる行数に制限があるかどうかを知りたかったのです。40 億行、4 列、約 40 GB のテーブルを使用しています。fread は最初の ~ 8 億 4000 万行のみを読み取るようです。エラーは発生しませんが、すべてのデータを読み取ったかのように R プロンプトに戻ります。

現時点では fread は「製品用」ではないことを理解しており、製品リリースの実装に時間枠があるかどうかを知りたいと考えていました。

私が data.table を使用している理由は、そのようなサイズのファイルの場合、data.frame などにファイルをロードする場合と比較して、データの処理が非常に効率的だからです。

現時点では、他の2つの選択肢を試しています-

1) スキャンを使用して data.table に渡す

data.table(matrix(scan("file.csv",what="integer",sep=","),ncol=4))

Resulted in --
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  too many items

2)ファイルを複数の個々のセグメントに分割し、制限は約です。Unix分割を使用して5億行を順次読み取ります...次に、ファイルを順次freadにループします-少し面倒ですが、唯一の実行可能なソリューションのようです.

これをさらに高速に行う Rcpp の方法があると思いますが、一般的にどのように実装されているかはわかりません。

前もって感謝します。

4

1 に答える 1

8

Stackoverflow の別の投稿からのフィードバックを使用して、これを達成することができました。このプロセスは非常に高速で、fread を繰り返し使用して約 10 分で 40 GB のデータが読み取られました。Foreach-dopar を単独で実行して新しい data.tables にファイルを順番に読み込むと、以下のページにも記載されているいくつかの制限により、機能しませんでした。

注: ファイル リスト (file_map) は、実行するだけで作成されました --

file_map <- list.files(pattern="test.$")  # Replace pattern to suit your requirement

mclapply with big objects - 「シリアル化が大きすぎて生のベクターに保存できません」

引用 --

collector = vector("list", length(file_map)) # more complex than normal for speed 

for(index in 1:length(file_map)) {
reduced_set <- mclapply(file_map[[index]], function(x) {
  on.exit(message(sprintf("Completed: %s", x)))
  message(sprintf("Started: '%s'", x))
  fread(x)             # <----- CHANGED THIS LINE to fread
}, mc.cores=10)
collector[[index]]= reduced_set

}

# Additional line (in place of rbind as in the URL above)

for (i in 1:length(collector)) { rbindlist(list(finalList,yourFunction(collector[[i]][[1]]))) }
# Replace yourFunction as needed, in my case it was an operation I performed on each segment and joined them with rbindlist at the end.

私の関数には、file_map で指定されたように、ファイルごとに複数のコアにわたって実行される Foreach dopar を使用するループが含まれていました。これにより、結合されたファイルで実行するときに「シリアル化が大きすぎるエラー」に遭遇することなく dopar を使用できました。

もう 1 つの役立つ投稿は -- loading files in parallel not working with foreach + data.table です。

于 2013-07-12T14:25:46.547 に答える