【发布时间】:2016-09-05 18:29:03
【问题描述】:
这是我第一次使用 XML 数据,如果您能提供任何帮助/建议,我将不胜感激!
我正在将一些存储在 AWS 上的数据提取到 XML 文件的集合中。我有一个索引文件,其中包含托管 XML 文件的 ~200,000 个 URL 的列表。我目前正在使用 R 中的 XML 包来循环遍历每个 URL,并从我感兴趣的节点中提取数据。这工作正常,但是由于 URL 如此之多,这个循环大约需要 12 小时才能完成。
这是我的代码的简化版本。 index 文件包含 URL 列表。解析的 XML 文件不是很大(在本例中存储为 dat...R 告诉我它们是 432 字节)。我已将NodeOfInterest 作为占位符放入我通常会列出要从中提取数据的 XML 标记的位置。
for (i in 1:200000) {
url <- paste('http://s3.amazonaws.com/',index[i,9],'_public.xml', sep="") ## create URL based off of index file
dat <- (xmlTreeParse(url, useInternal = TRUE)) ## load entire XML file
nodes <- (getNodeSet(dat, "//x:NodeOfInterest", "x")) ##find node for the tag I'm interested in
if (length(nodes) > 0 & exists("dat")) {
dat2 <- xmlToDataFrame(nodes) ##create data table from node
compiled_data <- rbind(compiled_data, dat2) ##create master file
rm(dat2)
}
print(i)
}
似乎必须有一种更有效的方法来提取这些数据。我认为最长的步骤(到目前为止)是将 XML 加载到内存中,但我还没有发现任何建议另一种选择的东西。有什么建议???
提前致谢!
【问题讨论】:
-
您是否对代码进行了基准测试或分析?即,您是否看到 R 大部分时间都花在了哪里?
compiled_data的空间是否已预先分配?餐巾纸计算的背面说您需要 0.216 秒/文件(考虑到 Internet 延迟、XML 解析和rbinding,这是 gd)。您的选择之一是使用 R 中的并行包之一来分而治之。另一种是将xmlToDataFrame和rbinding 保存到解析之后。另一个是在 RAW XML 中readLines,然后在本地/读取之后(可能并行)进行所有其他处理。
标签: r xml performance loops amazon-s3