System() открывает соединение?
У меня есть команда entrez, которую я прохожу через цикл в R, и, кажется, какое-то время она работает нормально, но в конечном итоге я получаю сообщение об ошибке, которое мне трудно понять.
Error in system(command = paste0(<string modified in loop>, :
cannot popen '<paste'd string>', probable reason 'Too many open files'
Цикл ниже начнет давать сбой на 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 ответ
Похоже, это связано с аргументом "тайм-аут"!
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
в то время как просто закомментировав вызывающую ошибку строку, цикл завершится.
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!")
Очевидно, мне просто нужно было поспать в этот другой день.