Ищете, как экспортировать «методы» в кластеры в R? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь отсортировать большой список последовательностей РНК по тому, как они были сращены, сначала донором, а затем акцептором. В серии мои методы работают, но при попытке распараллелить процесс с функциями из пакета parallel я сталкиваюсь с ошибкой:

Error in checkForRemoteErrors(val) : 
  4 nodes produced errors; first error: no method for coercing this S4 class to a vector

Я понимаю, что первая часть ошибки говорит о том, что все 4 ядра моего ноутбука сталкиваются с этой ошибкой, но кроме этого я могу только догадываться, что что-то не было экспортировано в кластер с моими функциями. Я приложил ниже упрощенную версию моего кода:

numcores <- detectCores()
cl <- makeCluster(numcores)

fasta.file <- list("---cg-a-ct---g--atggtactg",
                   "--cg-a-ct---g--atggcactg-",
                   "cg-a-ct---g--atggtactg-gc",
                   "agt-gt-tcacccggtga--aattg")
#Just a list of DNA sequences with gaps inserted. In reality, I am reading a fasta file
#with 94k+ sequences of length 1000.

filelength <- length(fasta.file)

clusterExport(cl,c("DNAString",
                   "fasta.file",
                   "matchPattern"))
#^Exporting the list of sequences, as well as two functions I will need.

UnknownDonor <- parLapply(cl,
                          1:filelength, 
                          function(i) DNAString(
                                                gsub(
                                                     "-",
                                                     "",
                                                     fasta.file[[i]]
                                                    ),
                                                start = 1,
                                                nchar = nchar(
                                                              gsub(
                                                                   "-", "", fasta.file[[i]]
                                                                   )
                                                              )
                                                )
                         )
#^The sequences I received are aligned, so I am removing gaps, represented by "-". 
#Then I convert each sequence to object class "DNAString", from their first character, 
#after removing gaps, to their last. This is so they can be sorted later. So far no 
#errors.

UnknownDonors <- length(UnknownDonor)

clusterExport(cl,c("UnknownDonor","UnknownDonors"))
#Exporting new variables to be used by the cluster.

D1map <- parSapply(cl,
                   1:UnknownDonors,
                   function(i) length(
                                      nchar(
                                            matchPattern("CGACTG",
                                                         UnknownDonor[[i]], 
                                                         max.mismatch = 0,
                                                         min.mismatch = 0, 
                                                         with.indels = TRUE,
                                                         fixed = TRUE, 
                                                         algorithm = "auto"
                                                        )
                                            )
                                     )
                  )
#The code for D1map is supposed to produce a binary vector map of list UnknownDonor,
#saying which positions in the list have the exact sequence "CGACTG", a sequence known
#to only come immediately before the donor splice site D1. It does this when running
#sapply, but not parSapply.

Исходя из предоставленных мною данных, моим ожидаемым результатом будет назначение D1map вектора [1,1,1,0]. Вместо этого я получаю ошибку, указанную выше. Я пробовал

A. clusterExport(cl,"Biostrings::matchPattern")

B.

D1map <- parSapply(cl,
                   1:UnknownDonors,
                   function(i) length(
                                      nchar(
                                            **Biostrings::matchPattern**("CGACTG",
                                                        UnknownDonor[[i]], 
                                                        max.mismatch = 0,
                                                        min.mismatch = 0, 
                                                        with.indels = TRUE,
                                                        fixed = TRUE, 
                                                        algorithm = "auto"
                                                                        )
                                            )
                                     )
                  ) 

C. importMethodsFrom(Biostrings, matchPattern)

A. в результате object "Biostrings::matchPattern" not found

B. привело к той же ошибке, что и мой исходный код.

C. в результате function importMethodsFrom not found.

Запускать мой код поочередно на этом этапе невозможно. На моем ноутбуке запускается 94,5 последовательности. Линейная экстраполяция потребует 26,5 дней, чтобы классифицировать 400 000 000 файлов последовательности, которые не выровнены. Я понимаю, я просто положил много кода. Я надеюсь, что мои комментарии помогут. Я пытался сделать код максимально понятным для человека. Если требуется какое-либо разъяснение или вы считаете, что мой вопрос нуждается в реорганизации, сообщите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...