2016-05-02 15 views
11

Ich schreibe ein R-Paket, das von vielen anderen Paketen abhängt. Wenn ich zu viele Pakete in die Sitzung geladen Ich habe häufig diesen Fehler:Fehler: Maximale Anzahl der DLLs erreicht

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... 

Dieser Beitrag Exceeded maximum number of DLLs in R wies darauf hin, dass das Problem mit dem Rdynload.c der Basis R-Code ist: #define MAX_NUM_DLLS 100

Gibt es Eine Möglichkeit, dieses Problem zu umgehen, außer das Ändern und Erstellen von Quellen?

+0

Haben Sie versucht, Microsoft R zu verwenden? Ich bin mir nicht sicher, ob das funktionieren wird, aber es könnte eine brauchbare Alternative sein. – hrbrmstr

+0

Ich habe gerade den Quellcode von Microsoft R überprüft. Ich glaube nicht, dass sie den '#define MAX_NUM_DLLS 100' Code geändert haben. Außerdem können einige Pakete, die kompiliert werden müssen, nicht installiert werden. –

Antwort

11

Die Erhöhung dieser Zahl ist natürlich "möglich" ... aber es kostet auch ein bisschen (Hinzufügen zum festen Speicherbedarf von R).

Ich habe dieses Limit nicht festgelegt, aber ich bin mir ziemlich sicher, dass es auch als Erinnerung daran gedacht war, dass der Benutzer ein wenig in seiner R-Sitzung "aufräumt", d. H. Paketnamespaces nicht unnötig lädt. Ich kann mir noch nicht vorstellen, dass du> 100 Pakete benötigst | Namespaces, die in Ihrer R-Sitzung geladen wurden. OTOH, einige Pakete haben heutzutage eine Vielzahl von Abhängigkeiten, so stimme ich zu, dass dies zumindest zufällig öfter passieren kann als in der Vergangenheit. Die eigentliche Lösung wäre natürlich eine Codeverbesserung, die mit einer relativ kleinen Anzahl von "DLLinfo" -Strukturen (sagen wir 32) beginnt und dann bei Bedarf weitere Batches (etwa 32) zuweist.

Patches zu den R-Quellen (Entwicklungsstamm in Subversion bei https://svn.r-project.org/R/trunk/) sind sehr willkommen!

---- hinzugefügt 26. Jan. 2017: In der Zwischenzeit hatten wir eine public bug report darüber, ein vorgeschlagenes Patch (was nicht gut genug war: Es gibt immer ein Betriebssystem abhängig von der Anzahl der offene Dateien), und heute, dass Bug-Report von R Kernelement @TomasKalibera geschlossen wurde, den neuen Code implementiert, wo die maximale Anzahl des geladenen DLLs bei

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

und so unter Windows und Linux (und noch nicht getestet gesetzt , aber "fast sicher" macOS), sollte die Grenze deutlich höher als zuvor sein.

----- Update # 2 (geschrieben am 5. Januar 2018):
Im Oktober 17 wurde die obige Änderung mit folgenden Commits zu den Quellen (der Entwicklungsversion von R - automatischer gemacht: nur!)

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

Increase the number of DLLs that can be loaded by default. If needed, increase the soft limit on open files.

und auf der Hilfeseite ?dyn.load (https://stat.ethz.ch/R-manual/R-devel/library/base/html/dynload.html) wird die ulimit -n <num_open_files> jetzt erwähnt (Abschnitt Hinweis schließen nach unten).

Sie könnten also die Entwicklungsversion von R in Betracht ziehen, bis sie im April "Mainstream" wird.
Alternativ haben Sie (in einem Terminal/Shell)

ulimit -n 2048

und dann R von diesem Terminal starten. Tomas Kalibera hat dies erwähnt, um auf macOS zu arbeiten.

+0

würde das R-Core-Team offen dafür sein, MAX_NUM_DLLS auf 200 oder so zu stoßen? Oder gibt es mehr, als hier auffällt? Ich arbeite an der R-Paket mlr und wir stoßen auf dieses Problem bei der Durchführung von Unit-Tests für alle Lernenden –

+0

Ja, es ist etwas mehr .. siehe die Threads auf der R-devel Mailing-Liste, siehe z. mein letzter Post https://stat.ethz.ch/pipermail/r-devel/2016-December/073529.html (und Nachrichten um ihn herum). Ich hoffe, wir haben etwas bis R 3.4.0 ca April'17 (und ziemlich viel früher, wenn Sie bereit sind, mit der Entwicklungsversion von R zu arbeiten. –

+0

haben das gleiche Problem hier - war ein Paket mit vielen Abhängigkeiten zu kodieren, und ich bekomme jetzt auch diesen fehler ... –

9

Ab R 3.4 können Sie mit der Umgebungsvariable R_MAX_NUM_DLLS eine andere maximale Anzahl von DLLs festlegen.Aus dem Release Notes:

The maximum number of DLLs that can be loaded into R e.g. via dyn.load() can now be increased by setting the environment variable R_MAX_NUM_DLLS before starting R.

+0

Um dies global einzustellen, sollte es Renviron oder Renviron.site hinzugefügt werden? –

+0

Siehe "Start", oder Google gibt mehrere Referenzen, die die Startkonfiguration für R beschreiben, z. [Verstehen R's Startup] (https://rviews.rstudio.com/2017/04/19/r-for-enterprise-understanding-rs-startup/) –

4

hatte ich dieses Problem mit der simpleSingleCell Bibliothek in Bioconductor

Auf dem macOS Sie nicht überschreiten 256. So stelle ich meinen .Renviron in meinem Home-Verzeichnis R_MAX_NUM_DLLS = 150

+0

Scheint das tatsächliche Limit auf MacOS ist 153, sonst wird R 3,4 fatal werfen Error. –

-1

Es ist einfach Gehen Sie auf die Umgebungsvariable und bearbeiten

Variable name = R_MAX_NUM_DLL 
Value = 1000 

Restart R worke d gut für mich

Verwandte Themen