9

R で ff のようなパッケージを使用する必要がある大規模なテーブル (〜 9,400 万行、3 列) でいくつかの基本的な計算を実行しようとしています。ただし、このパッケージを使用するとメモリ不足になり、私のコンピューターがこれを処理する以上の能力があることは知っていますが。ハードウェア/ソフトウェアの仕様と、ff パッケージを適切に使用していないように見えるコードを以下に示します。私は 100 時間以上かけて ff パッケージに関するすべての pdf、ppt、および Web サイトを読みましたが、ff の使用方法を (少なくとも私のようなアマチュアには) 明確に説明しているものは見つかりませんでした。私が間違っていることについての助けをいただければ幸いです。このロジックは、約 110 万行までカウントすると機能するようですが、それ以降は範囲外になるようです。

また、「for」ループを合計サイズの 1/200 のチャンクに分割しようとしました。ループの各パスで既存の ShortPrice および LongPrice ff ファイルの新しい ff オブジェクトを作成し、各パスの最後で rm()、gc() を作成します。最初に read.table.ffdf を介して各列の ff ファイルを作成すると、 vmode = "quad", "integer を使用して既存の TradePosition ff ファイルに新しい ff オブジェクトを作成しようとすると、何らかの理由で TradePosition 値が失われます。 」または「生」。

ハードウェア/ソフトウェア仕様:

  • 2012 年 6 月 16 GB RAM、i7 クアッドコア プロセッサ、512 GB SSD を搭載した Macbook Pro
  • OS X 10.8.2
  • 32 ビット R プログラムの使用

データ/テーブル:

  • 「Trades.txt」という名前のテキスト ファイルには、94,741,221 行、3 列があります。
  • TradePosition という名前の列 1 (「ファクター」タイプ、レベル/値 = 「0」、「ショート」または「ロング」)
  • ShortPrice という名前の列 2 ("double" タイプ、値は EUR/USD の通貨価格を小数点以下 5 桁まで表します)
  • LongPrice という名前の列 3 (「double」型、値は EUR/USD の通貨価格を小数点以下 5 桁まで表します)
  • 内部 R 変数 "DatasetLength" = 94,741,221

コード:

library(ff)
options("fftempdir"="/Users/neil/Code/","ffbatchbytes"=20*getOption("ffbatchbytes"),"ffmaxbytes"=8*getOption("ffmaxbytes"),"ffpagesize"=1000*65536,"ffcaching"="mmnoflush")
ffdfTrades <- read.table.ffdf(file="/Users/neil/Code/Trades.txt",nrows=DatasetLength,FUN="read.table",header=TRUE,sep=";",quote="",colClasses=c("factor","numeric","numeric"),comment.char="")

Transactions <- c(rep(0,DatasetLength))
dataindex <- 1
for (dataindex in seq(1,DatasetLength-1,1)) {

    if (ffdfTrades$TradePosition[dataindex]!=ffdfTrades$TradePosition[dataindex+1]) {

        if (ffdfTrades$TradePosition[dataindex+1]=="Short") {

            if (ffdfTrades$TradePosition[dataindex]=="Long") {
                Transactions[dataindex+1] <- -2*ffdfTrades$ShortPrice[dataindex+1]
            }

            else {
                Transactions[dataindex+1] <- -1*ffdfTrades$ShortPrice[dataindex+1]
            }
        }

        else {

            if (ffdfTrades$TradePosition[dataindex+1]=="Long") {

                if (ffdfTrades$TradePosition[dataindex]=="Short") {
                    Transactions[dataindex+1] <- 2*ffdfTrades$LongPrice[dataindex+1]
                }

                else {
                    Transactions[dataindex+1] <- 1*ffdfTrades$LongPrice[dataindex+1]
                }
            }
        }
    }

    message(paste("Row ",dataindex," done.",sep=""))
    dataindex <- dataindex + 1
}
4

2 に答える 2

6

最初の発言: 16Gb の RAM がある場合に 32 ビット バージョンの R を実行するのは残念ですが、それを完全に使用するには 64 ビット バージョンを使用しないのはなぜですか?

あなたの質問について: Henrico が指摘しているように、ff も R も適切に使用していません。R の各行をループすることは、基本 R ではなく、ff ではなく、物事を行う方法ではありません。コードをベクトル化する必要があります。大規模なデータの処理ではなく、R データ処理の基本概念に関する R コースに従うことをお勧めします。

その発言とは別に、パッケージ ffbase のいくつかの追加ユーティリティを使用して ff で探しているものを次に示します。Short/Long と乗算をどうするかについての正確な仕様は見ていませんが、R の基本パッケージで通常の ifelse を使用する場合と同様に、必要に応じて ffifelse を変更できます。頑張って ff を試してみてください。

size <- 1000000
trades <- data.frame(TradePosition = factor(sample(c("0","Short","Long"), size, replace=TRUE)), ShortPrice = rnorm(size), LongPrice = rnorm(size))
write.table(trades, file = "Trades.txt", sep=";", row.names=FALSE)

require(ff)
require(ffbase)
trades <- read.table.ffdf(file="Trades.txt", sep=";", header=TRUE, colClasses=c("factor","numeric","numeric"))
idx <- cumsum(ff(1, length=nrow(trades)))
idx <- ffwhich(idx, idx < nrow(trades))
trades$previousposition <- c(ff(factor(NA)), trades$TradePosition[idx])
yourmultiplier <- 2
yourothermultiplier <- -1
trades$transactions <- ffifelse(trades$TradePosition == "Long", 
                            ffifelse(trades$previousposition == "Short", yourmultiplier*trades$ShortPrice, trades$ShortPrice),
                            ffifelse(trades$previousposition == "Long", yourothermultiplier*trades$LongPrice, trades$LongPrice))
于 2012-12-29T01:55:55.120 に答える
4

Rでビッグデータを使用する方法を説明している(IMHO素晴らしい)スライドへのリンクは次のとおりです。

http://www.bytemining.com/2010/07/take-r-to-the-limit-part-i-parallelization-in-r/ http://www.bytemining.com/2010/08/take- r-to-the-limit-part-ii-large-datasets-in-r/

どちらも R ユーザー グループ向けの講演からのもので、大規模なデータ セットを処理するためのさまざまなアプローチについて詳しく説明しています。bigmemoryが中心ですが、ffも特集されています。

私は、以前のコメント投稿者のように、bigmemory アプローチを好みます。主な理由は、使用可能なドキュメントを見つけやすくなるためです。具体的には、上のスライドの航空会社のデータの例を見ていくと、目を見張るものがあります。

次に、総当たりではなく、シナリオによっては、9,500 万行の大規模なサンプルを試すことで、意味のある結論に到達するのに十分な場合があります。

幸運を!

于 2012-12-29T20:11:28.140 に答える