当查找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分配值。
答案 0 :(得分:0)
避免在分配df2[i,] <- df
的情况下循环增长对象(顺便说一下,仅当 df 为单行时才有效),并避免{{1}要求簿记}和迭代器while
。
相反,请考虑使用i
构建数据帧列表,然后可以在循环外的一个调用中lapply
一起使用。
rbind