मेरे रेल एप्लिकेशन के हिस्से के रूप में, मैंने एक छोटा आयातक लिखा है जो हमारे एलडीएपी सिस्टम से डेटा में बेकार है और इसे उपयोगकर्ता तालिका में क्रैम करता है। दुर्भाग्यवश, हमारे 32 के उपयोगकर्ताओं को सक्रिय करते समय एलडीएपी से संबंधित कोड मेमोरी की भारी मात्रा में लीक करता है, और मैं इस मुद्दे को ठीक करने का तरीका समझने में सक्षम नहीं हूं।रूबी नेट/एलडीएपी मॉड्यूल में मेमोरी लीक
समस्या एलडीएपी लाइब्रेरी से किसी तरह से संबंधित प्रतीत होती है, जब मैं एलडीएपी सामानों को कॉल हटा देता हूं, तो स्मृति उपयोग अच्छी तरह से स्थिर हो जाता है। इसके अलावा, प्रजनन करने वाली वस्तुएं नेट :: बीईआर :: BerIdentifiedString और नेट :: बीईआर :: BerIdentifiedArray, एलडीएपी लाइब्रेरी के दोनों भाग हैं।
जब मैं आयात चलाता हूं, तो स्मृति उपयोग अंततः 1 जीबी से अधिक हो जाता है। अगर समस्या है तो मुझे अपने कोड को सही करने के लिए कुछ रास्ता ढूंढना होगा, या एलडीएपी मेमोरी के मुद्दों के आसपास काम करना होगा यदि समस्या है। (या रूबी के लिए बड़े आयात के लिए एक बेहतर LDAP पुस्तकालय हो, तो, मुझे लगता है कि के लिए खुला के रूप में अच्छी तरह से कर रहा हूँ।)
यहाँ हमारे मेरी कोड के उचित सा है:
require 'net/ldap'
require 'pp'
class User < ActiveRecord::Base
validates_presence_of :name, :login, :email
# This method is resonsible for populating the User table with the
# login, name, and email of anybody who might be using the system.
def self.import_all
# initialization stuff. set bind_dn, bind_pass, ldap_host, base_dn and filter
ldap = Net::LDAP.new
ldap.host = ldap_host
ldap.auth bind_dn, bind_pass
ldap.bind
begin
# Build the list
records = records_updated = new_records = 0
ldap.search(:base => base_dn, :filter => filter) do |entry|
name = entry.givenName.to_s.strip + " " + entry.sn.to_s.strip
login = entry.name.to_s.strip
email = login + "@txstate.edu"
user = User.find_or_initialize_by_login :name => name, :login => login, :email => email
if user.name != name
user.name = name
user.save
logger.info("Updated: " + email)
records_updated = records_updated + 1
elsif user.new_record?
user.save
new_records = new_records + 1
else
# update timestamp so that we can delete old records later
user.touch
end
records = records + 1
end
# delete records that haven't been updated for 7 days
records_deleted = User.destroy_all(["updated_at < ?", Date.today - 7 ]).size
logger.info("LDAP Import Complete: " + Time.now.to_s)
logger.info("Total Records Processed: " + records.to_s)
logger.info("New Records: " + new_records.to_s)
logger.info("Updated Records: " + records_updated.to_s)
logger.info("Deleted Records: " + records_deleted.to_s)
end
end
end
किसी भी मदद के लिए अग्रिम धन्यवाद/संकेत!
वैसे, मैंने नेट/एलडीएपी समर्थन मंच में इसके बारे में भी पूछा था, लेकिन वहां कोई उपयोगी पॉइंटर्स नहीं मिला।
आप कनेक्शन स्ट्रिंग को असंबद्ध कहां कर रहे हैं? ldap.unbind? – Mike
हाय माइक, दस्तावेज़ों में एक अनइंड विधि शामिल नहीं है, न ही नमूना कोड में से कोई भी है, इसलिए मुझे लगा कि इसकी आवश्यकता नहीं थी। (http://net-ldap.rubyforge.org/) इसके अलावा, किसी भी रिकॉर्ड के माध्यम से फिर भी शुरू करने के बाद तक कोई अंत नहीं होगा, है ना? पुनरावृत्ति के दौरान स्मृति रिसाव हो रहा है। मैं दिमागी तूफान की सराहना करता हूं। –
इस खोज से डेटा सेट कितना बड़ा है? मुझे लगता है कि डेटा एक या दो बार डुप्लिकेट हो रहा है। रूबी का संस्करण भी सहायक हो सकता है। इसके अलावा, क्या आप 'फ़िल्टर' का उपयोग कर रहे हैं जिसका आप उपयोग कर रहे हैं? आखिरकार, मामले की संभावना नहीं है, लेकिन मैंने अन्य प्लेटफार्मों पर एलडीएपी पुस्तकालयों को देखा है, नेस्टेड समूहों पर बहुत अधिक पुनरावृत्ति करते हैं - संचार के टीसीपी डंप को देखते समय मुझे केवल एहसास हुआ ... – Brian