JSTOR XML大循环中的内存和优化问题

时间:2019-06-19 16:42:21

标签: r xml performance loops jstor

当查找JSTOR的200,000多个文档进行研究时,我遇到了记忆和优化问题。这些文档为xml格式。可以在以下位置找到更多信息:https://www.jstor.org/dfr/

在代码的第一步中,我通过以下方式将xml文件转换为整洁的数据帧:


    Transform <- function (x)
    {
        a <- xmlParse (x)
        aTop <- xmlRoot (a)

        Journal <- xmlValue(aTop[["front"]][["journal-meta"]][["journal-title group"]][["journal-title"]])
        Publisher <- xmlValue (aTop[["front"]][["journal-meta"]][["publisher"]][["publisher-name"]])
        Title <- xmlValue (aTop[["front"]][["article-meta"]][["title-group"]][["article-title"]])
        Year <- as.integer(xmlValue(aTop[["front"]][["article-meta"]][["pub-date"]][["year"]]))
        Abstract <- xmlValue(aTop[["front"]][["article-meta"]][["abstract"]])
        Language <- xmlValue(aTop[["front"]][["article-meta"]][["custom-meta-group"]][["custom-meta"]][["meta-value"]])

        df <- data.frame (Journal, Publisher, Title, Year, Abstract, Language, stringsAsFactors = FALSE)

    df
    }

在序列中,我使用第一个函数将一系列xml文件转换为单个数据帧:


    TransformFiles <- function (pathFiles)
    {

        files <- list.files(pathFiles, "*.xml")
        i = 2
        df2 <- Transform (paste(pathFiles, files[i], sep="/", collapse=""))
        while (i<=length(files)) 
        { 
            df <- Transform (paste(pathFiles, files[i], sep="/", collapse=""))
            df2[i,] <- df

            i <- i + 1
        }

    data.frame(df2)
    }

当我有超过100000个文件时,需要几个小时才能运行。如果使用200000,它最终会随着时间的流逝而破裂或变慢。即使是小规模的套装,也可以注意到它随着时间的推移运行速度变慢。我在做些事吗?我可以做些什么来优化代码吗?我已经尝试过rbind和bind-rows,而不是直接使用df2 [i,] <-df分配值。

1 个答案:

答案 0 :(得分:0)

避免在分配df2[i,] <- df的情况下循环增长对象(顺便说一下,仅当 df 为单行时才有效),并避免{{1}要求簿记}和迭代器while

相反,请考虑使用i构建数据帧列表,然后可以在循环外的一个调用中lapply一起使用。

rbind