मैं रूबी (2.0.0 p39474) में बहुत तेजी से फ़ाइल पहुंच निष्पादित कर रहा हूँ, और अपवाद Too many open files
रूबी फ़ाइल हैंडल प्रबंधन (बहुत अधिक खुली फ़ाइलों)
this thread को देखा करने के बाद मिल रही है, here, और विभिन्न अन्य स्रोतों , मैं ओएस सीमाओं के बारे में अच्छी तरह से जानता हूं (मेरे सिस्टम पर 1024
पर सेट करें)।
मेरे कोड का हिस्सा है जो इस फ़ाइल का उपयोग mutexed है करता है, और रूप ले लेता है:
File.open(filename, 'w'){|f| Marshal.dump(value, f) }
जहां filename
तेजी से परिवर्तन के अधीन है, धागा खंड बुला के आधार पर। यह मेरी समझ है कि यह फ़ॉर्म ब्लॉक के बाद अपने फ़ाइल हैंडल को छोड़ देता है।
मैं ObjectSpace.each_object(File)
का उपयोग कर खुले File
वस्तुओं की संख्या को सत्यापित कर सकता हूं। यह रिपोर्ट करता है कि स्मृति में 100 निवासी हैं, लेकिन उम्मीद के अनुसार केवल एक ही खुला है।
आगे, अपवाद स्वयं को उस समय फेंक दिया जाता है जब ObjectSpace
द्वारा रिपोर्ट की गई केवल 10-40 File
वस्तुएं होती हैं। इसके अलावा, मैन्युअल रूप से कचरा संग्रहण इन गणनाओं में से किसी एक को सुधारने में विफल रहता है, क्योंकि sleep
कॉल डालने से मेरी स्क्रिप्ट धीमा हो जाती है।
मेरा प्रश्न इसलिए है:
-
एम आई मौलिक ओएस सीमा की प्रकृति गलतफहमी --- यह एक प्रक्रिया के पूरे जीवनकाल को कवर करता है?-
यदि हां, तो कैसे वेब सर्वरulimit -n
फ़ाइलों पर पहुँचने के बाद बाहर दुर्घटनाग्रस्त होने से बचने हो? -
क्या रूबी अपनी ऑब्जेक्ट सिस्टम के बाहर अपनी फ़ाइल हैंडल को बरकरार रखता है, या कर्नेल 'समवर्ती' पहुंच की गणना करने में बस इतना धीमा है?
-
संपादित 20,130,417: strace
इंगित करता है कि माणिक लौटने और ऐसा करने से पहले म्युटेक्स रिहा, फाइल करने के लिए अपने डेटा के सभी लिखना नहीं है। इस प्रकार, फ़ाइल ओएस सीमा तक ढेर हो जाती है।
इसे ठीक करने की कोशिश में, मैं syswrite
/sysread
, तुल्यकालिक मोड का इस्तेमाल किया है, और close
से पहले flush
कहा जाता है। इन तरीकों में से कोई भी काम नहीं किया।
मेरा प्रश्न इस प्रकार करने के लिए संशोधित किया गया है: क्यों माणिक अपनी फ़ाइल हैंडल बंद करने के लिए विफल हो रहा है, और कैसे मैं ऐसा करने के लिए यह मजबूर कर सकते हैं?
'स्ट्रेस' इंगित करता है कि रूबी फ़ाइल खोलता है, फिर फ़ंक्शन से वापस आता है, डेटा लिखने से पहले म्यूटेक्स को छोड़ देता है। अपवाद के बाद संसाधन बंद करते समय कुछ मामलों में यह फ्लश भी नहीं करता है, और डिस्क पर लिखने को समाप्त करता है (यानी शटडाउन के दौरान)। –