5

読み込んでからdata.tableを返すために呼び出される関数を作成しました。

read.in.data <- function(filename)
{
    library(data.table)
    data.holder<-read.table(filename, skip=1)
    return(data.table(data.holder))
}

関数が処理するときにRAMを観察すると、Rはこれを2つのステップで処理しているように見えます(または、少なくともこれが何が起こっているかについての私の最良の推測です)。たとえば、1.5 GBのファイル(15列で1行あたり合計136文字)をロードすると、Rは1)データを読み込んで1.5 GBのRAMを使用し、2)別の1.5GBのRAMを使用するように見えます。リターン。

data.table(またはそのことについてはdata.frame)を作成し、メモリ内で複製を必要とせずにdata.tableを返す関数を作成するためのトリックはありますか?または、テーブルが作成される関数内でdata.tableのすべての処理を実行する必要がありますか?

観察:このコードを2回続けて実行すると、メモリはクリアされません。RAMが8GBしかないため、機能が失敗します。「read.table」を変数に格納するステップをスキップすると(以下に示すように)、何のメリットもありません。data.tableを返す前にクリーンアップする機能が必要なので、これは絶対に行いたくありません。問題を修正すると、メモリを使い果たすことなく、より大きなファイルを処理できるようになります。

short.read.trk <- function(fntrk)
{
    library(data.table)
    return(data.table(read.table(fntrk, skip=1)))
}
4

1 に答える 1

2

メモリの節約が主に求めているものである場合は、一度に1列ずつ変換できます。

library(data.table)
read.in.data <- function(filename)
{
  data.holder <- read.table(filename, skip=1)
  dt <- data.table(data.holder[[1]])
  names(dt) <- names(data.holder)[1]
  data.holder[[1]] <- NULL

  for(n in names(data.holder)) {
    dt[, `:=`(n, data.holder[[n]]) ]
    data.holder[[n]] <- NULL
  }
  return(dt)
}

(未テスト)

速くなることはありません。実際、おそらく遅くなります。しかし、それはメモリの無駄を少なくする必要があります。

于 2013-02-08T23:47:40.520 に答える