使用ff处理大数据

时间:2017-11-26 06:52:45

标签: r ff

我正在使用16Gb的数据集。这个过程太大而无法加载到RAM内存中,所以我需要在R中使用某种bigdata handeling方法。 我的数据集由很多变量组成,其中大多数是字符变量,如名称和地址。 我想做数据清理/编辑,比如根据现有变量创建新变量和地理编码地址。 我尝试过使用ff包但我无法使用它。 首先,我无法将数据集正确地转换为ffdf文件。 第二,当我有点做的时候,我无法按照它在早期常规数据帧上的工作方式进行数据清理。

示例数据集的问题示例:

#create example dataset similar to mine with strings 
df2 <- read.table(text='npi dier  getal  mubilair
             51  "aap"  een  tafel
             52  vis  twee stoel
             53 paard  twee  zetel
             54  kip  drie  fouton
             55  beer vier   fouton
             56  aap  vijf   bureau
             57  tijger  zes bank
             58  zebra  zeven  sofa
             59  olifant  acht  wastafel
             60  mens acht  spiegel', header=T, sep='')
dfstring <- df2[,-1]
rownames(dfstring) <- df2[,1]
    write.csv(dfstring, "~/UC Berkeley/Research/dfstring.csv")

library(ff)

# creating the ff file
headset = read.csv(file="~/UC Berkeley/Research/dfstring.csv", header = TRUE, nrows = 5000)
headclasses = sapply(headset, class)
str(headclasses)
dfstring.ff <- read.csv.ffdf(file="~/UC Berkeley/Research/dfstring.csv", first.rows=5000, colClasses=headclasses)
#doesn't work error:scan() expected 'an integer', got '"51"'

headclasses [c(1)] = "factor"
dfstring.ff <- read.csv.ffdf(file="~/UC Berkeley/Research/dfstring.csv", first.rows=5000, colClasses=headclasses)
dfstring.ff
#set all variables to factor

dfstring.ff$getalmubilair <- paste(dfstring.ff$getal, dfstring.ff$mubilair, sep = ' ')
#doesn't work error: assigned value must be ff

getalmubilair <- paste(dfstring.ff$getal, dfstring.ff$mubilair, sep = ' ')
getalmubilair
#doesn't work creates an empty object

我的问题:

  1. 首先是ff在我的条件下使用的包,大数据中的很多字符变量?

  2. 如果是这种情况如何将我的文件加载到正确的ff文件中? (例如,如何使用first.rows或colClasses)

  3. 可以对ff文件执行哪些操作,它们与常规数据框中的操作有何不同?

  4. 哪里可以找到一个可以理解的ff包的手册/演练,我已经看过一些,但它们非常技术性,我无法通过它们。

  5. 旁注: 我尝试使用colClasses需求以下列方式删除不必要的变量:

    #Delete the unnecessary variables:
    headclasses[c(1,2)]= "NULL"
    

    但是,我收到以下错误:

      

    repnam中的错误(colClasses,colnames(x),default = NA):.   以下参数名称不匹配

    如果我能够立即删除真实数据集中不必要的变量,它可能会更快。那我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

由于您的文件大小是&#34;巨大的&#34;我建议将此文件存储在db(例如SQLite)中,然后使用RSQLite包处理它。其他选项可以是直接对存储在hdfs中的文件使用RHadoop


您还可以通过循环遍历内存中的小块来阅读使用read.table 的大文件。您可以尝试下面的代码段。

chunkSize <- 1000000
testFile <- "testFile.csv"
con <- file(description=testFile, open="r")

#column headers
headers <- strsplit(readLines(testFile,n=1), split=',')[[1]]

df <- read.table(con, nrows=chunkSize, header=T, fill=T, sep=",", col.names = headers)

repeat {
  if (nrow(df) == 0)
    break
  print(head(df))

  ####
  #add code to process chunk data
  ####

  #read next chunk
  if (nrow(df) != chunkSize)
    break
  df <- tryCatch({
    read.table(con, nrows=chunkSize, skip=0, header=F, fill=T, sep=",", col.names = headers)
  }, error=function(e){
    if (identical(conditionMessage(e), "no lines available in input"))
      data.frame()
    else stop(e)
  })
}
close(con)


如果您想阅读有关ff个套餐的信息,可以参考thisofficial website上提供的演示文稿。