У меня есть этот набор данных, который я пытаюсь проанализировать в R. Данные из HMDB и имя набора данных Serum Metabolites
(в формате xml файла). Файл xml содержит около 25K узлов метаболитов, каждый из которых я хочу проанализировать на подузлы.
У меня есть код, который анализирует XML-файл на объект списка в R. Поскольку XML-файл довольно большой и поскольку для каждого метаболита есть около 12 подузлов, которые мне нужны, для синтаксического анализа файла требуется много времени. около 3 часов до 1000 метаболитов. Я пытаюсь использовать пакет parallel
, но получаю сообщение с ошибкой.
Пакеты:
library("XML")
library("xml2")
library( "magrittr" ) #for pipe operator %>%
library("pbapply") # to track on progress
library("parallel")
Функция:
# The function receives an XML file (its location) and returns a list of nodes
Short_Parser_HMDB <- function(xml.file_location){
start.time<- Sys.time()
# Read as xml file
doc <- read_xml( xml.file_location )
#get metabolite nodes (only first three used in this sample)
met.nodes <- xml_find_all( doc, ".//d1:metabolite" ) [1:1000] # [(i*1000+1):(1000*i+1000)] # [1:3]
#list of data.frame
xpath_child.v <- c( "./d1:accession",
"./d1:name" ,
"./d1:description",
"./d1:synonyms/d1:synonym" ,
"./d1:chemical_formula" ,
"./d1:smiles" ,
"./d1:inchikey" ,
"./d1:biological_properties/d1:pathways/d1:pathway/d1:name" ,
"./d1:diseases/d1:disease/d1:name" ,
"./d1:diseases/d1:disease/d1:references",
"./d1:kegg_id" ,
"./d1:meta_cyc_id"
)
child.names.v <- c( "accession",
"name" ,
"description" ,
"synonyms" ,
"chemical_formula" ,
"smiles" ,
"inchikey" ,
"pathways_names" ,
"diseases_name",
"references",
"kegg_id" ,
"meta_cyc_id"
)
#first, loop over the met.nodes
L.sec_acc <- parLapply(cl, met.nodes, function(x) { # pblapply to track progress or lapply but slows down dramticlly the function and parLapply fo parallel
#second, loop over the xpath desired child-nodes
temp <- parLapply(cl, xpath_child.v, function(y) {
xml_find_all(x, y ) %>% xml_text(trim = T) %>% data.frame( value = .)
})
#set their names
names(temp) = child.names.v
return(temp)
})
end.time<- Sys.time()
total.time<- end.time-start.time
print(total.time)
return(L.sec_acc )
}
Теперь создайте среду:
# select the location where the XML file is
location= "D:/path/to/file//HMDB/DataSets/serum_metabolites/serum_metabolites.xml"
cl <-makeCluster(detectCores(), type="PSOCK")
clusterExport(cl, c("Short_Parser_HMDB", "cl"))
clusterEvalQ(cl,{library("parallel")
library("magrittr")
library("XML")
library("xml2")
})
И выполните:
Short_outp<-Short_Parser_HMDB(location)
stopCluster(cl)
Получена ошибка:
> Short_outp<-Short_Parser_HMDB(location)
Error in checkForRemoteErrors(val) :
one node produced an error: invalid connection
на основе этих ссылок, попытался реализовать параллель:
- Параллельная обработка в R
- Как вызвать глобальную функцию из функции
parLapply
? - Ошибка в параллельном R: Ошибка в checkForRemoteErrors (val): 2 узла выдали ошибки; первая ошибка: не удается открыть соединение
но не смог найти invalid connection
как ошибку
Я использую Windows 10 последней версии R 4.0.2 (не уверен, достаточно ли информации)
Любой намек или идея будут оценены
xpath_child.v
как функцию в вашем коде, а это переменная. Вы поместили это на местоFUN
вlapply
? - person Oliver   schedule 25.08.2020cl
. Благодарю вас! Однако теперь есть новая ошибка: Ошибка в checkForRemoteErrors (val): 16 узлов вызвали ошибки; первая ошибка: внешний указатель недействителен - person TaL   schedule 25.08.2020met.nodes
) хранится со стороны пакета. Изучение этого этого вопроса, похоже, тоже предполагает это. Я бы посоветовал попытаться найти другие вопросы (и решения) для параллельных реализаций объектов xml / xml2 в R, поскольку мои знания, к сожалению, на данный момент заканчиваются. - person Oliver   schedule 25.08.2020