4

我正在尝试.xml使用 R 从 Wikipedia Dumps 读取和处理 ~5.8GB。我没有那么多 RAM,所以我想分块处理它。(目前使用时xml2::read_xml完全阻塞了我的电脑)

该文件xml包含每个维基百科页面的一个元素,如下所示:

<page>
    <title>AccessibleComputing</title>
    <ns>0</ns>
    <id>10</id>
    <redirect title="Computer accessibility" />
    <revision>
      <id>631144794</id>
      <parentid>381202555</parentid>
      <timestamp>2014-10-26T04:50:23Z</timestamp>
      <contributor>
        <username>Paine Ellsworth</username>
        <id>9092818</id>
      </contributor>
      <comment>add [[WP:RCAT|rcat]]s</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text xml:space="preserve">#REDIRECT [[Computer accessibility]]

{{Redr|move|from CamelCase|up}}</text>
      <sha1>4ro7vvppa5kmm0o1egfjztzcwd0vabw</sha1>
    </revision>
</page>

可以在此处找到该文件的示例

从我的角度来看,我认为可以分块读取它,例如文件中的每页一页。Ans 将每个已处理page的元素保存为.csv文件中的一行。

我想要一个包含以下列的data.frame。

id、标题和文本。

我该怎么做才能.xml分块阅读?

4

1 回答 1

3

它可以改进,但主要思想在这里。您仍然需要定义最佳方法来定义函数内部每次交互中要读取的行数, readLines()以及读取每个块的方法,但是获取块的解决方案在这里:

xml <- readLines("ptwiki-20161101-pages-articles.xml", n = 2000)

inicio <- grep(pattern = "<page>", x = xml)
fim <- grep(pattern = "</page>", x = xml)
if (length(inicio) > length(fim)) { # if you get more beginnings then ends
  inicio <- inicio[-length(inicio)] # drop the last one
}

chunks <- vector("list", length(inicio))

for (i in seq_along(chunks)) {
  chunks[[i]] <- xml[inicio[i]:fim[i]]
}

chunks <- sapply(chunks, paste, collapse = " ")

我已经尝试过read_xml(chunks[1]) %>% xml_nodes("text") %>% xml_text()了,它成功了。

于 2016-11-05T21:53:39.807 回答