6

Rでは、時系列データのいくつかのセットをhttp://www.truefx.com/?page=downloadsからxtsとして結合して変換しようとしていますが、ファイルが大きく、多くのファイルがあるため、問題が発生しています私のノートパソコン。それらは、zip ファイルとして圧縮された csv ファイルとして保存されます。

それらをダウンロードして解凍するのは簡単です (ただし、ハード ドライブで多くのスペースを占有します)。

1 か月分のデータの 350MB 以上のファイルを R にロードすることは、パッケージの新しいfread()関数を使用するとかなり簡単です。data.table

タイムスタンプを簡単に読み取ることができ、中間列が生成されるように、いくつかのデータテーブル変換が (関数内で) 行われます。次に、データテーブルが RData ファイルとしてハードドライブに保存され、データテーブルオブジェクトへのすべての参照がワークスペースから削除され、削除gc()後に実行されます...ただし、アクティビティモニターで R セッションを確認すると (実行Mac から)...それでもほぼ 1GB の RAM を占有しているように見えます...そして、物事は少し遅れているように見えます...数年分の csv ファイルを同時に読み込んで変換するつもりでした。使用可能なデータテーブルに変換し、それらを組み合わせて単一の xts オブジェクトを作成します。これは、1 か月だけで 1 GB の RAM を使用する場合には実行不可能に思えます。

各ファイルを順番にダウンロードして変換し、保存してRをシャットダウンし、ロードしてバインドできるRDataファイルがたくさんできるまで繰り返すことができることはわかっていますが、これを行うためのより効率的な方法があるのではないかと期待していました。データテーブルへのすべての参照を削除すると、「通常」ではない、または RAM 使用量の起動レベルに戻ります。メモリをクリアするより良い方法はありますgc()か? どんな提案でも大歓迎です。

4

1 に答える 1

7

私のプロジェクトでは、多くの大きなファイルを処理する必要がありました。私は次の原則に基づいてルーチンを編成しました。

  1. Rメモリを大量に消費する操作を別のスクリプトに分離します。
  2. 実行後に破棄される新しいプロセスで各スクリプトを実行します。したがって、システムは使用済みメモリを返します。
  3. テキスト ファイルを介してスクリプトにパラメーターを渡します。

以下のおもちゃの例を考えてみましょう。

データ生成:

setwd("/path/to")
write.table(matrix(1:5e7, ncol=10), "temp.csv") # 465.2 Mb file

slave.R - メモリを消費する部分

setwd("/path/to")
library(data.table)

# simple processing
f <- function(dt){
  dt <- dt[1:nrow(dt),]
  dt[,new.row:=1]
  return (dt)
}

# reads parameters from file
csv <- read.table("io.csv")
infile  <- as.character(csv[1,1])
outfile <- as.character(csv[2,1])

# memory-hungry operations
dt <- as.data.table(read.csv(infile))
dt <- f(dt)
write.table(dt, outfile)

master.R - 別のプロセスでスレーブを実行する

setwd("/path/to")

# 3 files processing
for(i in 1:3){
  # sets iteration-specific parameters
  csv <- c("temp.csv", paste("temp", i, ".csv", sep=""))
  write.table(csv, "io.csv")

  # executes slave process
  system("R -f slave.R")
}
于 2013-01-25T00:33:38.927 に答える