System () открывает соединение? - PullRequest
1 голос
/ 28 января 2020

У меня есть команда entrez, которую я передаю через al oop в R, и, кажется, какое-то время она работает нормально, но в итоге я получаю сообщение об ошибке. Мне трудно разобраться.

Error in system(command = paste0(<string modified in loop>,  : 
  cannot popen '<paste'd string>', probable reason 'Too many open files'

Ниже l oop начнет работать на 1020-м итераторе:

GeneraAddresses <- vector(mode = "list",
                          length = length(PossibleGenera))

for (m1 in seq_along(GeneraAddresses)) {
  GeneraAddresses[[m1]] <- try(system(command = paste0("esearch -db assembly -query ",
                                                       "'",
                                                       PossibleGenera[m1],
                                                       "[organism] AND \"complete genome\"[filter]",
                                                       " AND \"latest genbank\"[filter]",
                                                       " AND \"genbank has annotation\"[Properties]",
                                                       "'",
                                                       " | ",
                                                       "efetch -format docsum",
                                                       " | ",
                                                       "xtract -pattern DocumentSummary -block FtpPath",
                                                       ' -match "@type:genbank"',
                                                       " -element FtpPath"),
                                      timeout = 300L,
                                      intern = TRUE))

  print(showConnections(all = TRUE))
  print(m1)
  closeAllConnections()
}

В этом случае вам не нужен фактический вектор родов, из которого я пытаюсь извлечь:

rep("streptomyces", 2000) -> PossibleGenera

отлично справится с задачей. Мне не удалось найти способ, чтобы ошибка появилась раньше (для упрощения диагностики), и просьба R закрыть все открытые соединения, кажется, не помогает (включено в код выше). Я знаю, что могу прибегнуть к тому, чтобы просто разбить свой вектор на более мелкие части и перебрать их таким образом, но это похоже на то, чтобы сдаться.

Работа в MacOS:

> sessionInfo()
R version 3.6.2 (2019-12-12)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.4

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats4    parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] Heron_0.0.0.9023    igraph_1.2.4.2      ape_5.3             stringr_1.4.0       DECIPHER_2.14.0     RSQLite_2.2.0       Biostrings_2.54.0  
 [8] XVector_0.26.0      IRanges_2.20.2      S4Vectors_0.24.3    BiocGenerics_0.32.0

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.3      magrittr_1.5    zlibbioc_1.32.0 bit_1.1-15.1    lattice_0.20-38 rlang_0.4.3     blob_1.2.1      tools_3.6.2     grid_3.6.2     
[10] nlme_3.1-143    DBI_1.1.0       bit64_0.9-7     digest_0.6.23   vctrs_0.2.2     memoise_1.1.0   stringi_1.4.5   compiler_3.6.2  pkgconfig_2.0.3

1 Ответ

1 голос
/ 29 января 2020

Похоже, что это связано с аргументом 'timeout'!

Iterations <- 2000L
ItOut <- vector(mode = "character",
                length = length(Iterations))

for (m1 in seq_len(Iterations)) {
  system(command = paste0("echo ",
                          '"',
                          "Iteration ",
                          m1,
                          '"'),
         timeout = 300L,
         intern = TRUE) -> ItOut[m1]
  print(m1)
}

print("completed successfully!")

Произойдет ошибка на 1021, что даст:

...
[1] 1019
[1] 1020
Error in system(command = paste0("echo ", "\"", "Iteration ", m1, "\""),  : 
  cannot popen 'echo "Iteration 1021"', probable reason 'Too many open files'
Execution halted

, а простое закомментирование ошибочной строки позволит l oop до конца.

Iterations <- 2000L
ItOut <- vector(mode = "character",
                length = length(Iterations))

for (m1 in seq_len(Iterations)) {
  system(command = paste0("echo ",
                          '"',
                          "Iteration ",
                          m1,
                          '"'),
         # timeout = 300L,
         intern = TRUE) -> ItOut[m1]
  print(m1)
}

print("completed successfully!")

Видимо, мне просто нужно было спать в этот другой день.

...