0

一度に1行ずつ大きなファイルを読み込んでいます。すべてを高速化するためにやりたいことは、複数の行を並行して処理することです。しかし、私が今行っている方法は機能していません。私はこれを試したことがないので、それがどのように機能するかはよくわかりません。

テストデータ.csv

library(foreach)
library(doParallel) #or with doMC



read.block <- function(ifile, lines, block, readFunc=read.csv,
                   skip=(lines*(block-1))+ifelse((header) & (block>1) & (!inherits(ifile, "connection")),1,0),
                   nrows=lines,header=TRUE,sep="\t",...){
  if(block > 1){
    colnms<-NULL
    if(header)
    {
      colnams <- unlist(readFunc(ifile, nrows=1, header=FALSE, sep=sep, stringsAsFactors=FALSE))
      #print(colnams)
    }
    p = readFunc(ifile, skip = skip, nrows = nrows, header=FALSE, sep=sep,...)
    if(! is.null(colnams))
    {
      colnames(p) = colnams
    }
  } else {
    p = readFunc(ifile, skip = skip, nrows = nrows, header=header, sep=sep)
  }
  return(p)
}

mendl.error <- matrix(, nrow=15, ncol=9)

foreach(i=1:15)%dopar%{
  ifile.c <- file("testdata.csv", open = "r") #open file connection to read
  ifile.valid <- read.block(ifile.c, lines=1, block=i) #read 1 line
  close(ifile.c) 
#do some other operations on the line which will be saved into a matrix
  mendl.error[1,] <- ifile.valid
}
4

1 に答える 1

2

「機能しない」の意味を特定していませんが、私は手足を動かして、期待どおりにスピードアップしないと言います(ただし、あなたが試みていることのセマンティクスについても明確ではありませんする)。

これは、コードがコンピューティング バウンドではなく、IO バウンドであるためです。つまり、セカンダリ ストレージからのデータを待機する必要があります。そのデータのバスはパラレルではないため、すべてのデータ読み取りリクエストはシリアル化されています。試みている方法で並列処理を使用しても、これを大幅に高速化することはできません。

実際、一度に読み取りを行い、正しいことを行うために R に依存する場合、コードはおそらく高速化されます。ここで生の読み取りパフォーマンスが本当に必要な場合は、おそらくメモリマップファイルに頼る必要があります。簡単な Google 検索で、これを実装するR パッケージが見つかりました。bigmemory

于 2013-12-02T20:37:04.687 に答える