2016-05-02 18 views
11

Piszę pakiet R, który zależy od wielu innych pakietów. Kiedy załadować zbyt wiele pakietów w sesji I często mam ten błąd:Błąd: Maksymalna liczba bibliotek DLL osiągniętych

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

Ten post Exceeded maximum number of DLLs in R podkreślić, że problem jest z Rdynload.c kodu baza R: #define MAX_NUM_DLLS 100

tam jest jakikolwiek sposób obejścia tego problemu, z wyjątkiem modyfikowania i budowania ze źródła?

+0

Czy próbowałeś użyć Microsoft R? Nie jestem pewien, czy to zadziała, ale może być realną alternatywą. – hrbrmstr

+0

Właśnie sprawdziłem kod źródłowy Microsoft R. Nie sądzę, że zmienili kod "#define MAX_NUM_DLLS 100". Również niektóre pakiety wymagające kompilacji nie mogą zostać zainstalowane. –

Odpowiedz

11

Zwiększenie tej liczby jest oczywiście "możliwe" ... ale kosztuje również nieco (dodanie do stałego miejsca pamięci R).

Nie ustawiłem tego limitu, ale jestem pewien, że było to również przypomnienie o tym, że useR może "oczyścić" trochę w swojej sesji R, tzn. Niepotrzebnie ładować przestrzeni nazw pakietów. Nie mogę sobie jeszcze wyobrazić, że potrzebujesz> 100 paczek | przestrzenie nazw załadowane w twojej sesji R. OTOH, niektóre pakiety mają obecnie wiele zależności, więc zgadzam się, że to przynajmniej może się zdarzyć przypadkowo częściej niż w przeszłości.

Prawdziwym rozwiązaniem byłoby oczywiście ulepszenie kodu, które zaczyna się od stosunkowo niewielkiej liczby struktur "DLLinfo" (powiedzmy 32), a następnie przydziela więcej partii (o wielkości powiedzmy 32) w razie potrzeby.

Naszywki na źródła R (pnia rozwojowa w subversion na https://svn.r-project.org/R/trunk/) są bardzo mile widziane!

---- dodano Jan 26, 2017: W międzyczasie mieliśmy public bug report o tym, proponowaną łatę (która nie była wystarczająco dobra: zawsze jest zależny od systemu operacyjnego limit liczby otwartych plików), a dziś, że raport o błędzie został zamknięty przez @TomasKalibera rdzeń członkowskich R którzy realizowanych nowy kod gdzie maksymalna liczba załadowanych bibliotek DLL jest ustawiony na

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

a więc na Windows i Linux (i jeszcze nie testowane , ale "prawie na pewno" macOS), limit powinien być znacznie wyższy niż poprzednio.

----- Aktualizacja nr 2 (napisana 5 stycznia 2018):
W październiku 17, powyższa zmiana została wprowadzona bardziej automatycznie z następującą zmianą do źródeł (wersji rozwojowej R - tylko!)

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.

oraz na stronie pomocy ?dyn.load (https://stat.ethz.ch/R-manual/R-devel/library/base/html/dynload.html) ulimit -n <num_open_files> jest teraz wymienić (sekcja Uwaga blisko do dołu).

Więc możesz rozważyć użycie wersji rozwojowej R, aż stanie się ona "głównym strumieniem" w kwietniu.
Alternatywnie, można zrobić (na terminalu/Shell)

ulimit -n 2048

R, a następnie rozpocząć od tego terminala. Tomas Kalibera wspomniał o tym, aby pracować na macOS.

+0

czy zespół R Core byłby otwarty na uderzenie MAX_NUM_DLLS do 200 punktów? Czy może jest coś więcej niż naocznie? Pracuję nad pakietem R mlr i napotkamy ten problem podczas wykonywania testów jednostkowych dla wszystkich uczniów –

+0

Tak, jest nieco więcej. Zobacz wątki na liście dyskusyjnej R-devel, zobacz np. mój ostatni wpis https://stat.ethz.ch/pipermail/r-devel/2016-December/073529.html (i wiadomości wokół niego). Mam nadzieję, że mamy coś przez R 3.4.0 ca April'17 (i nieco wcześniej, jeśli jesteś gotów pracować z wersją rozwojową R. –

+0

Mam ten sam problem tutaj - było kodowanie pakietu z wieloma zależnościami, i teraz otrzymuję również ten błąd ... –

9

Od wersji 3.4 można ustawić inną maksymalną liczbę bibliotek DLL i zmienną środowiskową R_MAX_NUM_DLLS.Z notatek wydaniu:

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

Aby ustawić to globalnie, czy powinno być dodane do Renviron lub Renviron.site? –

+0

Zobacz '? Uruchomienie' lub google podaje wiele odniesień opisujących konfigurację uruchamiania dla R, na przykład [Zrozumienie uruchamiania R] (https://rviews.rstudio.com/2017/04/19/r-for-enterprise-understanding-rs-startup/) –

4

miałem ten problem z biblioteką simpleSingleCell w BioConductor

Na MacOS nie może przekroczyć 256. Więc mogę ustawić .Renviron w moim domowym katalogu R_MAX_NUM_DLLS = 150

+0

Wydaje się, że rzeczywisty limit na MacOS to 153 inaczej R 3.4 rzuci śmiertelny błąd. –

-1

łatwo idź do zmiennej środowiskowej i edytować

Variable name = R_MAX_NUM_DLL 
Value = 1000 

Restart R worke d dobrze dla mnie