【问题标题】:What is a good way to generate a large datafile by appending records in R?通过在 R 中附加记录来生成大型数据文件的好方法是什么?
【发布时间】:2014-01-28 15:46:19
【问题描述】:

当我需要处理原始数据或生成大量合成数据时,我在 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. 稍后使用此数据而不将整个内容加载到内存中

我认为 ffbigmemory 之类的软件包应该对此有用,但我看到的示例与我的需要有点不同。是否有任何代码 sn-ps 在 R 中执行类似的操作?我认为一个简单的代码示例会很有帮助。

【问题讨论】:

  • R 和 Python 之间存在一些根本差异。在 R 中,您通常不会遍历每一行并附加它。通常有更好的选择。但是,R 旨在将所有内容保存在内存中。如果这对您来说不可能,您至少应该使用更大的整个数据块,而不仅仅是单行。或者你继续使用 Python,因为这似乎对你有用......
  • ffbigmemory 与您的需求有何不同?因为这些是您首先想到的问题。
  • @Roland 不是。在 Python 中,我不会遍历每一行并附加它——例如,我会使用 numpy 数组或 recarray。只是在这个特定的应用程序中我需要这样做。此外,每一行 VS 每个块在这里不是一个基本问题,问题是附加增量数据而不是一次生成所有内容。当然 - 我很想为此使用 Python,但我必须为这个应用程序使用 R。
  • @JanvanderLaan 对不起,我的意思是我看到的例子是数据集已经是 csv 文件的情况——这不是我想要的。

标签: python r pytables


【解决方案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 来使用它(只读)。

【讨论】:

    【解决方案2】:

    R 中的方法是相同的——打开一个文件进行写入,附加块,关闭文件。如果您熟悉 HDF5,那么rhdf5 是一种选择。 vignette 包在 3.3 节中包含了一个明确的迭代创建文件的示例。有效地做到这一点的关键是分块写入——多行以利用 R 的高效矢量化——而不是一次写一行。但是你也可以一次写一行。

    【讨论】:

    • 感谢您的回答,但我想要一个示例代码 sn-p。
    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多