r - 如何在大型数据集的简单 'for'循环中使用ff包

标签 r

我正在尝试对一张大表(约9400万行,3列)进行一些基本计算,这些表需要使用R中的ff等程序包。但是,我在使用此程序包时遇到了麻烦,内存不足,尽管我知道我的计算机有能力胜任这一工作。我在下面包括了我的硬件/软件规范,以及似乎没有正确使用ff软件包的代码。我已经花了100多个小时阅读每个ff软件包中提及任何内容的pdf,ppt和网站,而且我还没有发现任何可以清楚地说明如何使用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行,三列
  • 名为TradePosition的列1(“factor”类型,级别/值=“0”,“Short”或“Long”)
  • 第2列名为ShortPrice(“ double ”类型,值表示EUR/USD货币价格到小数点后5位)
  • 第3列,名为LongPrice(“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
    }
    

    最佳答案

    首先说明:如果您具有16Gb RAM,则运行32位版本的R是很可惜的,为什么不充分使用64位版本的R?

    对于您的问题:您没有像Henrico所指出的那样适本地使用ff或R。循环遍历R中的每一行只是做事的方式,不在ff中,不在基R中。您需要向量化代码。我建议您遵循R类(class),该类(class)与处理大数据无关,但与R数据处理的基本概念有关。

    除此之外,这是您在ffbase中使用ffbase软件包中的一些其他实用程序所要查找的内容。标记为我没有看您对使用Long/Long和乘法的确切说明,但是可以根据需要更改ffifelse,就像在R的基本程序包中使用普通ifelse一样。
    尝试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))
    

    关于r - 如何在大型数据集的简单 'for'循环中使用ff包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14074473/

    相关文章:

    r - 为另一列中的特定值计算一列中的唯一值,

    r - 如何对 data.table 中的多个列进行分组?

    在 RMarkdown 中引用一个简单的表格

    r - 将 geom_jitter 中的点保持在零以上

    r - 使用 dplyr::mutate(across()) 将多列应用于自定义函数

    r - 当使用相等 (==) 的因子对行进行子集化时,还包括 NA。 %in% 不会发生这种情况。正常吗?

    r - 如何在 "Empty reply from server"错误后使用 knitr 和 R Markdown 将图像上传到 imgur?

    r - 如何使用函数在data.table/R 中进行递归计算?

    r - 在ggplot2中手动缩放离散x轴变量

    r wordcloud 外部 ttf vfont 无法识别