programing

R 패키지를 언로드할 때 동적 라이브러리를 언로드해야 합니까?

testmans 2023. 6. 14. 21:42
반응형

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.2DLL을 언로드하지 않았지만 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

반응형