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
}