c lib आर पैकेजों को अनलोड लोड करने के लिए गतिशील पुस्तकालयों को अनलोड करना होगा?



हिंदी में पुस्तकालय विज्ञान के लिए यूजीसी नेट हल प्रश्न पत्र (1)

आम तौर पर एक डीएलएल उतारना एक अच्छा विचार होगा। जिन संसाधनों का स्वामित्व है, उन्हें पूरी तरह से मुक्त कर दिया जाएगा, और फिर से लोड करना कोई मुद्दा नहीं होगा।

आर में, आर पर्यावरण की जटिलता है, क्योंकि यदि एक डीएलएल उतार दिया जाता है, तो आर रनटाइम में कुछ ज्ञान पीछे छोड़ दिया जा सकता है। इस मामले में, परिणाम यह हो सकता है कि पुनः लोड डीएलएल लाइब्रेरी एक ही अनुमानित स्थिति को आर चर के रूप में साझा नहीं करती है जो डीएलएल राज्य को समझने के इरादे से हैं, और इस प्रकार त्रुटियां होती हैं।

मुझे लगता है कि एक आर पैकेज (डीएलएल और आर कोड) को सुरक्षित रूप से अनलोड करने के लिए संभव होगा, लेकिन आपके लिए डीएलएल लोड होने के लिए यह आसान होगा, जब तक आपको विशेष रूप से भारी संसाधन उपयोग न मिले।

हैडली के सी सर्वोत्तम practices :

सी ++ की तरह, जब भी आप अपने पैकेज में सी कोड का उपयोग करते हैं, तो पैकेज को अनलोड होने पर आपको DLL को अनलोड करना चाहिए:

.onUnload <- function (libpath) {
  library.dynam.unload("mypackage", libpath)
}

दूसरी तरफ आर एक्सटेंशन लिखना इसका जिक्र भी नहीं करता है। मैं देख सकता हूं कि डीएलएस को उतारने के लिए यह विनम्र कैसे होगा, लेकिन ऐसा करने से मेरे लिए कुछ अजीब समस्याएं होती हैं जो लोड / अनलोड / रीलोडेड होती हैं (उदाहरण आगे नीचे देखें)। इसके अतिरिक्त, कुछ उल्लेख हैं जो सुझाव देते हैं कि शायद अनलोडिंग की आवश्यकता नहीं है। से ?library.dynam :

ध्यान दें कि डीएलएल को अनलोड करना संभव है या नहीं और फिर उसी फ़ाइल के संशोधित संस्करण को फिर से लोड करना ओएस-निर्भर है: dyn.unload के लिए सहायता का 'मान' अनुभाग देखें।

हालांकि यह उन वस्तुओं को प्रभावित नहीं करना चाहिए जो संशोधित नहीं हैं। फिर आर-डेवेल में ब्रायन रिपली से यह टिप्पणी है:

ऐसा करने के बाद, मेरा अनुभव यह है कि डीएलएल को उतारने में अक्सर मदद नहीं होती है अगर आपको इसे फिर से लोड करने की आवश्यकता होती है (और यही वजह है कि टीएलटीटीके अपने डीएलएल को अनलोड नहीं करता है)।

तो सी पुस्तकालयों को लोड करने के लिए स्वीकार्य है? मैं इस बात को खोदना नहीं चाहूंगा कि नीचे की तरह सामान क्यों हो रहा है (पुस्तकालयों को उतारने से पहले ऐसा नहीं हुआ)।

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 ने अपने डीएलएल को अनलोड नहीं किया है, हालांकि अन्य पैकेज जो डीएलएल को अनलोड नहीं करते हैं, इस समस्या का कारण नहीं बनते हैं। data.table 1.9.4 ठीक काम करता है।





packages