0

大きな (~700Mb) .csv ファイルを R に読み込もうとしています。

このファイルには、256 未満の整数の配列が含まれており、1 つのヘッダー行と 2 つのヘッダー列があります。

私が使う:

trainSet <- read.csv(trainFileName)

これは最終的に次のようにbarfsします。

Loading Data...
R(2760) malloc: *** mmap(size=151552) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
R(2760) malloc: *** mmap(size=151552) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Error: cannot allocate vector of size 145 Kb
Execution halted

メモリ使用量を見ると、クラッシュ時にページ ファイルの使用量がゼロの 6Gb マシンで約 3Gb の使用量が発生したため、別の修正方法がある可能性があります。

私が使用する場合:

trainSet <- read.csv(trainFileName, header=TRUE, nrows=100)
classes = sapply(train,class); 

すべての列が「整数」としてロードされていることがわかります。これは 32 ビットだと思います。

3Gb を使用して 700Mb の .csv ファイルの一部をロードすることは、明らかに効率的ではありません。Rに列に8ビットの数値を使用するように指示する方法があるのだろうか? これは私が過去にMatlabで行ったことであり、うまくいきましたが、Rで8ビット型についての言及がどこにも見つからないようです.

それは存在しますか?read.csv を使用するように指示するにはどうすればよいでしょうか。

助けてくれてありがとう。

4

3 に答える 3

2

狭い答えは、アドオン パッケージffを使用すると、よりコンパクトな表現を使用できるようになるというものです。

欠点は、表現が異なるため、データを標準関数に渡すことができないことです。

そのため、アプローチを再考する必要があるかもしれません。おそらく、データをサブサンプリングするか、RAM を増やします。

于 2012-09-04T21:07:59.580 に答える
2

意地悪をするつもりはありませんが、これを修正する方法は次のドキュメントに記載されてい?read.csvます。

 These functions can use a surprising amount of memory when reading
 large files.  There is extensive discussion in the ‘R Data
 Import/Export’ manual, supplementing the notes here.

 Less memory will be used if ‘colClasses’ is specified as one of
 the six atomic vector classes.  This can be particularly so when
 reading a column that takes many distinct numeric values, as
 storing each distinct value as a character string can take up to
 14 times as much memory as storing it as an integer.

 Using ‘nrows’, even as a mild over-estimate, will help memory
 usage.

この例は、私の SSD でも I/O のために実行に時間がかかりますが、メモリの問題はありません。

R> # In one R session
R> x <- matrix(sample(256,2e8,TRUE),ncol=2)
R> write.csv(x,"700mb.csv",row.names=FALSE)

R> # In a new R session
R> x <- read.csv("700mb.csv", colClasses=c("integer","integer"),
+ header=TRUE, nrows=1e8)
R> gc()
            used  (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells    173632   9.3     350000   18.7    350000   18.7
Vcells 100276451 765.1  221142070 1687.2 200277306 1528.0
R> # Max memory used ~1.5Gb
R> print(object.size(x), units="Mb")
762.9 Mb
于 2012-09-04T23:21:50.333 に答える
2

Q: R に 8 ビットの数値を使用するように指示できますか

A: いいえ (編集: 以下の Dirk のコメントを参照してください。彼は私より賢いです。)

Q: RAM を増やすと効果がありますか?

A: たぶん。64 ビット OS と R の 64 ビット インスタンスが出発点であると仮定すると、「はい」、そうでない場合は「いいえ」になります。

暗黙の質問 A: 700 MB の .csv データセットは、によって読み込まれると 700 MB になりますread.csvか?

A: たぶん。それが実際にすべて整数である場合は、それよりも小さいか大きい可能性があります。整数ごとに 4 バイトが必要です。ほとんどの整数が -9 から 10 の範囲にある場合、それぞれ 4 バイトとして格納されると、実際にはサイズが「拡大」する可能性があります。現時点では、値ごとに 1 ~ 3 バイトしか使用していないため、サイズが約 50% 増加すると予想されcolClasses="integer"ます。読み取り関数で使用する必要があります。そうしないと、データ入力の不具合がある場合に、係数として、または 8 バイトの「数値」として格納される可能性があります。

暗黙の質問 B: データをワークスペースに入れた場合、それを操作できますか?

A: たぶん。自身の名前へのコピーであっても、割り当て時に R がコピーする方法のため、最大のオブジェクトの少なくとも 3 倍のメモリが必要です。

于 2012-09-04T21:31:52.240 に答える