【发布时间】:2014-07-26 23:53:32
【问题描述】:
我正在尝试读取数十万个 JSON 文件,并最终将它们放入 dplyr 对象中。但是 JSON 文件不是简单的键值解析,它们需要大量的预处理。预处理是编码的,并且对效率有很好的作用。但我面临的挑战是将每条记录有效地加载到单个对象(data.table 或 dplyr 对象)中。
这是非常稀疏的数据,我将有 2000 多个变量,这些变量大部分都将丢失。每条记录可能有一百个变量集。变量将是字符、逻辑和数字的混合体,我知道每个变量的模式。
我认为避免 R 为每次更新(或一次添加一行)复制对象的最佳方法是创建一个空数据框,然后在从 JSON 文件中提取特定字段后更新它们。但是在数据框中执行此操作非常慢,移动到数据表或 dplyr 对象要好得多,但仍希望将其减少到几分钟而不是几小时。请参阅下面的示例:
timeMe <- function() {
set.seed(1)
names = paste0("A", seq(1:1200))
# try with a data frame
# outdf <- data.frame(matrix(NA, nrow=100, ncol=1200, dimnames=list(NULL, names)))
# try with data table
outdf <- data.table(matrix(NA, nrow=100, ncol=1200, dimnames=list(NULL, names)))
for(i in seq(100)) {
# generate 100 columns (real data is in json)
sparse.cols <- sample(1200, 100)
# Each record is coming in as a list
# Each column is either a character, logical, or numeric
sparse.val <- lapply(sparse.cols, function(i) {
if(i < 401) { # logical
sample(c(TRUE, FALSE), 1)
} else if (i < 801) { # numeric
sample(seq(10), 1)
} else { # character
sample(LETTERS, 1)
}
}) # now we have a list with values to populate
names(sparse.val) <- paste0("A", sparse.cols)
# and here is the challenge and what takes a long time.
# want to assign the ith row and the named column with each value
for(x in names(sparse.val)) {
val=sparse.val[[x]]
# this is where the bottleneck is.
# for data frame
# outdf[i, x] <- val
# for data table
outdf[i, x:=val]
}
}
outdf
}
我认为每个列的模式可能已在每次更新时设置和重置,但我也通过预先设置每个列类型来尝试这样做,但这并没有帮助。
对我来说,使用 data.frame(上面已注释掉)运行此示例大约需要 22 秒,转换为 data.table 需要 5 秒。我希望有人知道幕后发生的事情,并能提供一种更快的方法来在这里填充数据表。
【问题讨论】:
-
您是否已将所有 JSON 文件预解析为列表,或者您是否在循环中一次执行一个?
标签: r data.table dplyr