Tôi đã gặp phải sự cố này một vài lần và không thể tìm ra giải pháp nào nhưng giải pháp nhỏ nhất (xem bên dưới).Phương pháp an toàn để cập nhật gói R - là "trao đổi nóng" có thể?
Giả sử máy tính đang chạy hơn 2 trường hợp R, do 2+ người dùng hoặc 1 người dùng đang chạy nhiều quy trình và một phiên bản thực hiện update.packages()
. Tôi đã có nhiều lần mà các trường hợp khác có thể nhận được phạm lỗi lên thời gian lớn. Các gói đang được cập nhật không thay đổi chức năng theo bất kỳ cách nào ảnh hưởng đến tính toán, nhưng bằng cách nào đó, một vấn đề lớn nảy sinh.
Giải pháp tầm thường (Giải pháp 0) là để chấm dứt tất cả các trường hợp của R trong khi update.packages()
thực thi. Điều này có hơn 2 vấn đề. Đầu tiên, người ta phải chấm dứt các cá thể R. Thứ hai, người ta thậm chí không thể xác định nơi các cá thể đó đang chạy (xem cập nhật 1).
Giả sử rằng hành vi của mã đang được thực thi sẽ không thay đổi (ví dụ: cập nhật gói đều có lợi - chúng chỉ sửa lỗi, cải thiện tốc độ, giảm RAM và cấp kỳ lân), có cách nào đó để trao đổi nóng phiên bản mới của gói có ít tác động đến các quy trình khác?
Tôi có hai giải pháp ứng cử viên nhiều hơn, bên ngoài của R:
Giải pháp 1 là sử dụng một đường dẫn thư viện tạm thời và sau đó xóa các thư viện cũ cũ và di chuyển cái mới vào đúng vị trí của nó. Hạn chế của việc này là xóa + di chuyển có thể phải mất một thời gian mà không có gì khả dụng.
Giải pháp 2 là sử dụng liên kết tượng trưng để trỏ đến thư viện (hoặc hệ thống phân cấp thư viện) và chỉ ghi đè liên kết tượng trưng bằng con trỏ đến thư viện mới nơi gói được cập nhật. Điều đó dường như phải chịu ít thời gian ngừng gói hơn - thời gian cần để hệ điều hành ghi đè lên một liên kết tượng trưng. Nhược điểm của điều này là nó đòi hỏi nhiều sự chăm sóc hơn trong việc quản lý các liên kết tượng trưng, và đặc trưng cho nền tảng.
tôi nghi ngờ rằng giải pháp # 1 có thể được sửa đổi để được như # 2, bằng cách sử dụng thông minh của .libPaths()
, nhưng điều này có vẻ như người ta cần đến không gọi update.packages()
và thay vào đó viết một updater mới tìm thấy các gói lỗi thời, cài đặt chúng vào một thư viện tạm thời, và sau đó cập nhật các đường dẫn thư viện. Điểm mấu chốt của điều này là người ta có thể hạn chế quy trình hiện tại thành .libPaths()
khi nó bắt đầu (tức là thay đổi đường dẫn thư viện R biết về có thể không được truyền cho những trường hợp đang chạy, mà không có sự can thiệp rõ ràng nào trong trường hợp đó).
Cập nhật 1. Trong trường hợp ví dụ, hai phiên bản R cạnh tranh nằm trên cùng một máy. Đây không phải là một yêu cầu: nếu tôi hiểu các bản cập nhật, nếu cả hai chia sẻ cùng một thư viện, nghĩa là cùng một thư mục trên ổ đĩa được chia sẻ, thì bản cập nhật vẫn có thể gây ra sự cố, ngay cả khi phiên bản R khác trên máy khác . Vì vậy, người ta có thể vô tình giết chết một quá trình R và thậm chí không nhìn thấy nó.
Đây là một tâm điểm. Tôi nghi ngờ rằng vấn đề của một thư viện được chia sẻ là một vấn đề trên các hệ điều hành. Đối với hầu hết việc sử dụng, tôi có khuynh hướng tin rằng điều này sẽ giết chết ý tưởng của việc thay đổi nóng. Trường hợp hẹp nhất sẽ dành cho các gói không sử dụng các thư viện chia sẻ bên ngoài, nhưng tôi không chắc nó hoạt động như thế nào cho các gói hoàn toàn trong R. – Iterator
Tôi nghĩ câu trả lời của bạn khá nhiều đè bẹp giấc mơ của hotswapping nói chung. Ngay cả khi tôi có một gói R thuần túy mà tôi muốn cập nhật, thì đó không phải là một thực hành tốt để cho rằng tôi có thể làm điều này. Vincent có một câu trả lời hợp lý về cách người ta có thể làm phiên bản, thay vì hoán đổi, tôi sẽ phải thích nghi một chút, nhưng rõ ràng đó là cách duy nhất xung quanh những xung đột bạn đã chỉ ra. – Iterator