Ошибка: максимальное количество DLL

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

Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  unable to load shared object '/Library/Frameworks/R.framework/Versions/3.2/Resources/library/proxy/libs/proxy.so':
  'maximal number of DLLs reached...

Это сообщение превысило максимальное количество DLL в R, указав, что проблема связана с Rdynload.c базового кода R: #define MAX_NUM_DLLS 100

Есть ли способ обойти эту проблему, кроме изменения и создания из исходного кода?

Ответ 1

Увеличение этого числа, конечно, "возможно"... но оно также стоит немного (добавив к памяти фиксированный объем памяти R).

Я не установил этот предел, но я уверен, что это также означало напоминание о том, что useR немного "очистит" в своем сеансе R, т.е. Не загружает пространства имен пакетов без необходимости. Я еще не могу представить, что вам нужно> 100 пакетов | пространства имен, загруженные в ваш сеанс R. OTOH, некоторые пакеты в настоящее время имеют множество зависимостей, поэтому я согласен, что это, по крайней мере, может происходить случайно чаще, чем в прошлом.

Реальное решение, конечно же, будет улучшением кода, которое начинается с относительно небольшого числа структур DLLinfo (скажем, 32), а затем при необходимости выделяет больше партий (размером 32).

Патчи к источникам R (разработка сундука в подрывной деятельности на https://svn.r-project.org/R/trunk/) приветствуются!

---- добавлено 26 января 2017 года. Между тем у нас был публичный отчет об ошибках, предлагаемый патч (который был недостаточно хорошим: всегда существует ограниченное ОС ограничение количества открытых файлов), и сегодня этот отчет об ошибке был закрыт членом R core @TomasKalibera, который внедрил новый код, где максимальное количество загружаемых DLL установлено на

pmax(100, pmin(1000, 0.6* OS_dependent_getrlimit_or_equivalent()))

и так далее на Windows и Linux (и еще не проверены, но "почти наверняка" macOS), предел должен быть значительно выше, чем раньше.

----- Обновление № 2 (написано 5 января 2018 года):
В октябре 17 вышеупомянутое изменение было сделано более автоматическим с последующим фиксацией источников (версии разработки R - только!)

r73545 | kalibera | 2017-10-12 14:41:20

Увеличьте количество DLL, которые могут быть загружены по умолчанию. При необходимости увеличьте мягкий предел для открытых файлов.

и на странице справки ?dyn.load (https://stat.ethz.ch/R-manual/R-devel/library/base/html/dynload.html) теперь упоминается ulimit -n <num_open_files> ( раздел Примечание близко к основанию).

Таким образом, вы можете рассмотреть возможность использования версии разработки R до тех пор, пока она не станет "основным потоком" в апреле.
Кроме того, вы выполняете (в терминале/оболочке)

ulimit -n 2048

и затем запустить R с этого терминала. Томас Калибера упомянул об этом для работы с macOS.

Ответ 2

Начиная с R 3.4 вы можете установить другое максимальное количество DLL, используя и переменную среды R_MAX_NUM_DLLS. Из примечаний к выпуску:

Максимальное количество DLL, которые могут быть загружены в R, например, через dyn.load(), теперь можно увеличить, установив переменную среды R_MAX_NUM_DLLS перед запуском R.

Ответ 3

У меня была эта проблема с простой библиотекой SimpleCell в биокондукторе

На macOS вы не можете превышать 256. Поэтому я установил свой.Renviron в своем домашнем каталоге R_MAX_NUM_DLLS = 150

Ответ 4

Легко Перейти к переменной окружения и редактировать

variable_name = R_MAX_NUM_DLL
value = 1000

Перезагрузка R работала хорошо для меня