R 패키지를 언로드할 때 동적 라이브러리를 언로드해야 합니까?
Hadley의 C 우수 관리 기준:
C++와 마찬가지로 패키지에서 C 코드를 사용할 때마다 패키지가 언로드될 때 DLL을 언로드해야 합니다.
.onUnload <- function (libpath) {
library.dynam.unload("mypackage", libpath)
}
반면에 R 확장자를 작성하는 것은 이것을 언급하지도 않습니다.dll을 언로드하는 것이 얼마나 예의인지 알 수 있지만, 그렇게 하면 로드/언로드/재로드되는 패키지에 대해 이상한 문제가 발생하는 것 같습니다(자세한 내용은 아래 예시 참조).또한 언로딩이 필요하지 않을 수도 있다는 몇 가지 언급이 있습니다.부터?library.dynam
:
DLL을 언로드한 다음 동일한 파일의 수정된 버전을 다시 로드할 수 있는지 여부는 OS에 따라 다릅니다. dyn.unload에 대한 도움말의 '값' 섹션을 참조하십시오.
수정되지 않은 개체에는 영향을 미치지 않습니다.다음은 R-devel의 Brian Ripley의 코멘트입니다.
모든 것을 말했지만, 제 경험에 따르면 DLL을 언로드하는 것은 당신이 DLL을 다시 로드할 필요가 있을 때 도움이 되지 않습니다(그래서 tcltk는 DLL을 언로드하지 않습니다).
그래서 C 라이브러리를 로드된 상태로 두는 것이 허용됩니까?저는 아래와 같은 일이 발생하는 이유를 캐고 싶지 않습니다(라이브러리 언로드를 시작하기 전에는 발생하지 않았습니다).
R version 3.1.1 (2014-07-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)
> library(alike) # install_github("brodieg/alike", ref="fdaa578e"), if you're curious
> library(data.table)
data.table 1.9.2 For help type: help("data.table")
> detach("package:data.table", unload=T)
> detach("package:alike", unload=T)
> library(alike)
> library(data.table)
Error : .onLoad failed in loadNamespace() for 'data.table', details:
call: address(x)
error: object 'Caddress' not found
In addition: Warning messages:
1: In FUN(X[[9L]], ...) :
failed to assign RegisteredNativeSymbol for alike to alike since alike is already defined in the ‘data.table’ namespace
2: In FUN(X[[9L]], ...) :
failed to assign RegisteredNativeSymbol for typeof to typeof since typeof is already defined in the ‘data.table’ namespace
3: In FUN(X[[9L]], ...) :
failed to assign RegisteredNativeSymbol for type_alike to type_alike since type_alike is already defined in the ‘data.table’ namespace
Error: package or namespace load failed for ‘data.table’
경고는 모두 다음과 관련되어 있습니다.alike
기능들. alike
동적 라이브러리를 언로드하는 데 사용하지 않았으며 위의 오류가 발생하지 않았습니다.언로딩을 구현한 후 오류가 발생하기 시작했습니다.참고:data.table 1.9.2
DLL을 언로드하지 않았지만 DLL을 언로드하지 않는 다른 패키지에서는 이러한 문제가 발생하지 않았습니다. data.table 1.9.4
잘 작동합니다.
일반적으로 DLL을 언로드하는 것이 좋습니다.소유한 리소스는 완전히 해방되고 다시 로드하는 것은 문제가 되지 않습니다.
R에서는 DLL이 언로드되더라도 R 런타임에 약간의 지식이 남아 있을 수 있기 때문에 R 환경의 복잡성이 있습니다.이 경우 다시 로드된 DLL 라이브러리가 DLL 상태를 이해하기 위한 R 변수와 동일한 유추 상태를 공유하지 않아 오류가 발생할 수 있습니다.
R 패키지(DLL 및 R 코드)를 안전하게 언로드할 수 있을 것으로 생각하지만, 특별히 리소스 사용량이 많은 경우가 아니라면 DLL을 로드한 상태로 두는 것이 더 쉬울 것입니다.
언급URL : https://stackoverflow.com/questions/26691878/must-r-packages-unload-dynamic-libraries-when-they-unload
'programing' 카테고리의 다른 글
부울 만족도에 대한 클래스 스케줄링 [다항식 시간 단축] (0) | 2023.06.14 |
---|---|
Best way to get application folder path (0) | 2023.06.14 |
동일한 페이지에서 다른 버전의 jQuery를 실행하려면 어떻게 해야 합니까? (0) | 2023.06.14 |
MariaDB 쿼리가 너무 느립니다. (0) | 2023.06.14 |
웹 팜 사이트의 web.config에 machineKey 추가 (0) | 2023.06.14 |