Kilka razy spotkałem się z tym problemem i nie jestem w stanie wymyślić żadnego rozwiązania, ale trywialnego (patrz poniżej).Bezpieczna metoda aktualizacji pakietów R - czy możliwe jest "hot-swap"?
Załóżmy, że komputer ma 2 lub więcej wystąpień R, z powodu użytkowników 2+ lub 1 użytkownika z wieloma procesami, a jedno wystąpienie wykonuje update.packages()
. Miałem kilka razy, kiedy druga instancja może zostać sfaulowana. Aktualizowane pakiety nie zmieniają funkcjonalności w żaden sposób wpływający na obliczenia, ale w jakiś sposób powstaje duży problem.
Rozwiązaniem trywialnym (Rozwiązanie 0) jest zakończenie wszystkich wystąpień R podczas wykonywania update.packages()
. To ma 2+ problemy. Po pierwsze, należy zakończyć instancje R. Po drugie, nie można nawet stwierdzić, gdzie te instancje są uruchomione (patrz aktualizacja 1).
Założenie, że zachowanie wykonywanego kodu nie zmieni się (np. Aktualizacje pakietów są korzystne - naprawiają tylko błędy, zwiększają szybkość, zmniejszają ilość pamięci RAM i udzielają jednorożców), czy istnieje sposób na szybką zamianę nowa wersja pakietu z mniejszym wpływem na inne procesy?
Mam dwa kolejne rozwiązania kandydujących, poza R:
Rozwiązanie 1 jest użycie ścieżki biblioteki tymczasowej, a następnie usunąć stary biblioteki i przenieść nowy na swoim miejscu. Wadą tego jest to, że usunięcie + ruchów może spowodować pewien czas, w którym nic nie jest dostępne.
Rozwiązanie 2 polega na użyciu dowiązań symbolicznych w celu wskazania biblioteki (lub hierarchii biblioteki) i wystarczy zastąpić dowiązanie symboliczne wskaźnikiem do nowej biblioteki, w której znajduje się zaktualizowany pakiet. Wydaje się, że czas przestoju pakietu jest krótszy - czas, w którym system operacyjny musi nadpisać dowiązanie symboliczne. Wadą tego jest to, że wymaga dużo więcej staranności w zarządzaniu dowiązaniami symbolicznymi i jest specyficzna dla platformy.
Podejrzewam, że rozwiązanie nr 1 może zostać zmodyfikowany tak, aby być jak # 2, poprzez inteligentne wykorzystanie .libPaths()
, ale to wydaje się jak trzeba nie rozmowy update.packages()
i zamiast napisać nowy updater że znajdzie przestarzałe pakiety, instaluje do biblioteki tymczasowej, a następnie aktualizuje ścieżki biblioteki. Plusem tego jest to, że można ograniczyć istniejący proces do .libPaths()
, który miał on, gdy się rozpoczął (tj. Zmiana ścieżek biblioteki, o których R wie, może nie być propagowana do tych instancji, które już są uruchomione, bez wyraźnej interwencji w tej instancji).
Aktualizacja 1. W tym scenariuszu dwie konkurujące ze sobą instancje R znajdują się na tym samym komputerze. Nie jest to wymagane: o ile rozumiem aktualizacje, jeśli te dwie biblioteki mają wspólne biblioteki, tj. Te same katalogi na wspólnym dysku, aktualizacja może nadal powodować problemy, nawet jeśli druga instancja R znajduje się na innej maszynie . Tak więc można przypadkowo zabić proces R, a nawet go nie zobaczyć.
To jest ważny punkt. Podejrzewam, że problem z udostępnioną biblioteką jest problemem w różnych systemach operacyjnych. Dla większego użycia jestem skłonny uwierzyć, że to zabija ideę hotswapping. Najmniejszy przypadek dotyczy pakietów, które nie korzystają z zewnętrznych bibliotek współdzielonych, ale nie jestem pewien, jak to działa w przypadku pakietów, które są w całości w stanie R. – Iterator
Myślę, że twoja odpowiedź niemal całkowicie niszczy marzenia o upuszczaniu na gorąco. Nawet jeśli mam czysty pakiet R, który chciałbym zamienić na gorąco, to nie jest dobrą praktyką zakładanie, że mogę to zrobić. Vincent ma rozsądną odpowiedź na to, jak można raczej pisać, a nie wymieniać, co będę musiał zaadaptować całkiem sporo, ale jasne jest, że jest to jedyny sposób na wskazanie konfliktów. – Iterator