19

中程度のサイズのファイル (4GB CSV) を読み込むのに十分な RAM がないコンピューター (64 ビット Windows では 8GB) があります。以前は、クラスター ノードにロードして読み込むだけでしたが、新しいクラスターではプロセスが 4 GB の RAM に制限されているようで (ハードウェアがマシンごとに 16 GB であるにもかかわらず)、短期的な修正が必要です。 .

使用可能なメモリ制限に合わせて CSV ファイルの一部を R に読み込む方法はありますか? そうすれば、一度にファイルの 3 分の 1 を読み取り、必要な行と列にサブセット化してから、次の 3 分の 1 を読み取ることができますか?

いくつかの大きなメモリのトリックを使用してファイル全体を読み取ることができる可能性があることを指摘してくれたコメント投稿者に感謝します: R で非常に大きなテーブルをデータフレームとしてすばやく読み取る

他のいくつかの回避策を考えることはできますが (たとえば、適切なテキスト エディターで開き、観測データの 2/3 を削除してから R に読み込むなど)、できれば避けたいと思います。

したがって、それをバラバラに読むことは、今のところ最善の方法のように思えます.

4

2 に答える 2

32

このスレッドを確認した後、この問題に対する顕著な解決策が言及されていないことに気付きました。コネクションを使おう!

1) ファイルへの接続を開きます

con = file("file.csv", "r")

2) read.csv を使用してコードのチャンクを読み込む

read.csv(con, nrows="CHUNK SIZE",...)

補足: colClasses を定義すると、作業が大幅に高速化されます。不要な列は必ず NULL として定義してください。

3) やるべきことは何でもする

4) 繰り返します。

5) 接続を閉じる

close(con)

このアプローチの利点は接続です。この手順を省略すると、処理が少し遅くなる可能性があります。接続を手動で開くことにより、基本的にデータ セットを開き、close 関数を呼び出すまでデータ セットを閉じません。これは、データセットをループしても場所を見失うことがないことを意味します。1e7 行のデータ セットがあるとします。また、一度に 1e5 行のチャンクをロードしたいとします。接続を開いたので、 を実行して最初の 1e5 行をread.csv(con, nrow=1e5,...)取得し、次に 2 番目のチャンクを取得するread.csv(con, nrow=1e5,...)ために同様に実行する、というように....

接続を使用しなかった場合、最初のチャンクは同じ方法で取得できますがread.csv("file.csv", nrow=1e5,...)、次のチャンクではread.csv("file.csv", skip = 1e5, nrow=2e5,...). これは明らかに非効率的です。1e5 行を読み取ったばかりであるにもかかわらず、もう一度 1e5+1 行を見つける必要があります。

最後に、data.table::fread素晴らしいです。ただし、接続を渡すことはできません。したがって、このアプローチは機能しません。

これが誰かに役立つことを願っています。

アップデート

人々はこの投稿に賛成票を投じ続けているので、もう 1 つ簡単な考えを追加したいと思います。readr::read_csvのような新しいは、read.csv接続を渡すことができます。ただし、約 10 倍高速 であると宣伝されています。

于 2015-05-22T18:49:18.937 に答える
11

たとえば、RSQLite を使用してデータベースに読み込み、SQL ステートメントを使用してその一部を取得できます。

1 つの部分だけが必要な場合read.csv.sqlは、sqldf パッケージでデータを sqlite データベースに読み込みます。まず、データベースが作成され、データは R を経由しないため、R の制限は適用されません (このシナリオでは主に RAM です)。次に、データをデータベースにロードした後、sqldf は指定された sql ステートメントの出力を R に読み取り、最後にデータベースを破棄します。データの処理速度によっては、複数ある場合は各部分に対してプロセス全体を繰り返すことができる場合があります。

たった 1 行のコードで 3 つの手順をすべて実行できるので、簡単に試すことができます。

DF <- read.csv.sql("myfile.csv", sql=..., ...other args...)

?read.csv.sqlおよびsqldf ホーム ページ?sqldf も参照してください。

于 2012-02-19T20:59:22.897 に答える