【问题标题】:How to use R to read XML data from S3 more quickly?如何使用 R 更快地从 S3 读取 XML 数据?
【发布时间】: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 中的并行包之一来分而治之。另一种是将xmlToDataFramerbinding 保存到解析之后。另一个是在 RAW XML 中readLines,然后在本地/读取之后(可能并行)进行所有其他处理。

标签: r xml performance loops amazon-s3


【解决方案1】:

如果将 XML 解析为树是您的关键点(在 xmlTreeParse 中),则可以使用像 SAX 这样的流接口,这将允许您只处理对您的应用程序有用的那些元素。我没用过,但是 xml2 包是建立在 libxml2 之上的,它提供了 SAX 能力。

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2019-08-29
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多