Параллельный пакет для windows 10 в R

У меня есть этот набор данных, который я пытаюсь проанализировать в 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

на основе этих ссылок, попытался реализовать параллель:

  1. Параллельная обработка в R
  2. Как вызвать глобальную функцию из функции parLapply?
  3. Ошибка в параллельном R: Ошибка в checkForRemoteErrors (val): 2 узла выдали ошибки; первая ошибка: не удается открыть соединение

но не смог найти invalid connection как ошибку

Я использую Windows 10 последней версии R 4.0.2 (не уверен, достаточно ли информации)

Любой намек или идея будут оценены


person TaL    schedule 24.08.2020    source источник
comment
Во-первых, вы не просто проводите параллели. Вы вкладываете свое параллельное выполнение. Это плохая идея, если вы не очень осторожны, поэтому один цикл (вероятно, внутренний цикл) следует заменить последовательным. Я ожидал много ошибок при экспорте узлов параллельного кластера в другой кластер.   -  person Oliver    schedule 24.08.2020
comment
Спасибо @Oliver. Я попытался выполнить параллельное изменение только внешнего приложения (оставьте его parLapply) и внутреннего изменения на обычное (lapply), но теперь получаю другую ошибку: Ошибка в checkForRemoteErrors (val): 16 узлов вызвали ошибки; первая ошибка: объект 'xpath_child.v' режима 'function' не найден. Не могли бы вы предложить какой-нибудь другой подход для обработки времени, необходимого для запуска кода?   -  person TaL    schedule 25.08.2020
comment
Ошибка аналогична проблеме, задаваемой здесь. Казалось бы, что-то вызывает xpath_child.v как функцию в вашем коде, а это переменная. Вы поместили это на место FUN в lapply?   -  person Oliver    schedule 25.08.2020
comment
Вы были правы, я изменил внутреннюю часть с parLapply ›на lapply, но не удалил переменную cl. Благодарю вас! Однако теперь есть новая ошибка: Ошибка в checkForRemoteErrors (val): 16 узлов вызвали ошибки; первая ошибка: внешний указатель недействителен   -  person TaL    schedule 25.08.2020
comment
Теперь это труднее просто увидеть. Судя по звуку, я мог бы предположить, что это как-то связано с тем, как объект (я предполагаю, met.nodes) хранится со стороны пакета. Изучение этого этого вопроса, похоже, тоже предполагает это. Я бы посоветовал попытаться найти другие вопросы (и решения) для параллельных реализаций объектов xml / xml2 в R, поскольку мои знания, к сожалению, на данный момент заканчиваются.   -  person Oliver    schedule 25.08.2020