通过在R中附加记录来生成大型数据文件的好方法是什么?

时间:2014-01-27 07:07:46

标签: python r pytables

当我需要处理原始数据或生成大量合成数据时,我在Python中使用pytables并遍历每一行并将该行“附加”到表中。所以我不必事先知道桌子的大小。例如,

import tables

class test(tables.IsDescription):
    col1 = tables.Int32Col()
    col2 = tables.Int32Col()

hdf5_a = tables.openFile('test.hdf5', 'a')

table = hdf5_a.createTable('/', 'test', test)

for i in range(10):
    table.row['col1'] = i
    table.row['col2'] = i * 10

    table.row.append()

table.flush()
hdf5_a.close()

我需要用R做同样的事情。基本上我想要:

  1. 生成合成数据
  2. 将数据动态附加到磁盘上的二进制文件
  3. 稍后使用此数据而不将整个内容加载到内存
  4. 我认为ffbigmemory这样的包应该对此有用,但我看到的例子与我的需求有点不同。是否有任何代码片段在R中执行类似的操作?我认为一个简单的代码示例将非常有用。

2 个答案:

答案 0 :(得分:1)

R中的方法是相同的 - 打开文件进行写入,附加块,关闭文件。如果您熟悉HDF5,则rhdf5是一种选择。包vignette在第3.3节中包含了创建文件的迭代的明确示例。关键是有效地执行此操作是以块的形式写入 - 多行以利用R的有效矢量 - 而不是一次使用单行。但你也可以一次写一行。

答案 1 :(得分:1)

首先是一个生成一些数据的函数

gendata <- function() {
  n <- 1E3
  data.frame(a = 1:n, b = rnorm(n), c = sample(letters, n, replace=TRUE))
}

ff + ffbase

对于ff,可以使用以下模式:

library(ffbase)

dat <- NULL
for (i in seq_len(10)) {
  d <- gendata()
  dat <- ffdfappend(dat, d)
}
save.ffdf(dat, dir="./test")

可以使用load.ffdf("./test")再次加载数据。

CSV

对于test / csv文件,可以使用以下模式:

con <- file("test.csv", "wt")
first_block <- TRUE
for (i in seq_len(10)) {
  d <- gendata()
  write.table(d, file=con, sep=",", row.names=FALSE, col.names=first_block)
  first_block <- FALSE
}
close(con)

要使用它,您首先必须将其导入ffbigmemory,或者您可以使用LaF使用它(只读)。