2013-08-31 12 views
5

मैं अपनी लाइब्रेरी के भीतर पारदर्शी और स्वीकार्य रूप से फ़ाइल/ब्लॉक डिवाइस द्वारा बड़े (परिभाषित मेमोरी से बड़ी परिभाषित) फ़ाइल को नियंत्रित करने के तरीके पर सहायता की तलाश में हूं। मान लें कि 32 बिट आर्किटेक्चर पर हमारे पास 512GB आकार का ब्लॉक डिवाइस है। mmap() का उपयोग कर स्मृति में डिवाइस/फ़ाइल के 32-बिट आर्किटेक्चर और प्रबंधन के हिस्सों के प्रबंधन के मुकाबले 512 जीबी अधिक है, जो कुछ मैं टालने की कोशिश कर रहा हूं।बड़ी फ़ाइल मेमोरी प्रबंधन

जो मैं प्राप्त करने की कोशिश कर रहा हूं वह 64-बिट संख्या/ऑफसेट के रूप में संबोधित किए गए ब्लॉक प्राप्त करने के लिए है और यह मनमानी है लेकिन आकार में स्थिर प्रति डिवाइस (512 बाइट्स, 4 के, 8 के, 64 एमबी, आदि) । कॉलर को केवल स्मृति पता होना चाहिए और स्मृति को मुक्त करने या वास्तविक सामग्री को स्मृति में लोड करने की देखभाल करने की आवश्यकता नहीं है।

मैं एक तंत्र के बारे में सोच रहा था इस प्रकार है:

  • एक void* get_file_address(unit64_t blk_offset) कॉल एक ऑफसेट (ब्लॉक संख्या) लेने की तरह कुछ और है कि जांच करता है कि इस ब्लॉक पहले से ही मैप किया गया है और नहीं करता है, तो में पढ़ता है और इसलिए यह नक्शे
  • कुछ संरचना है कि ब्लॉक (हर get_file_address कॉल पर अद्यतन)
  • एक स्मृति प्रबंधक है कि स्मृति कम हो जाता है और है कि शायद ही कभी इस्तेमाल किया ब्लॉक कि पहले उल्लेख किया संरचना
  • का उपयोग कर उतारने शुरू होता है उपयोग किया जा सकता करने के लिए उपयोग में गिना जाता है का ट्रैक रखता है

अंतिम बिंदु मुझे परेशान कर रहा था: मेरे द्वारा एक मेमोरी मैनेजर लिखना बेहद प्रतीत नहीं होता है। इसके अतिरिक्त, मुझे यकीन है कि मैं इस समस्या के साथ पहला नहीं हूं।

तो क्या वहां कोई समाधान/लाइब्रेरी/कोडफैगमेंट है जो पहले से ही ऐसे या समान मामले को प्रबंधित करने में मदद करता है? मैं विन, लिनक्स, * बीएसडी या ओएस एक्स के लिए समाधान के साथ ठीक हूं।

+3

आप फ़ाइल के केवल एक विशेष भाग को 'mmap' क्यों नहीं करते हैं और ब्लॉक में कहने पर इसे एक्सेस करते हैं? 'mmap' ऑफ़सेट एड्रेसिंग का समर्थन करता है ताकि आप 4K के ब्लॉक में फ़ाइल को पार कर सकें। – Nobilis

+0

@ नोबिलिस क्योंकि अगर मुझे एमएमएपी का उपयोग करना है, तो मुझे भी मनमैप का उपयोग करना होगा - और यह एक मेमोरी मैनेजर का काम है जिसे मैं खुद कोडिंग से बचना चाहता हूं, क्योंकि नौकरी ऐसा लगता है जैसे यह पहले से ही किया गया था: मेमोरी एड्रेस प्राप्त करें डिवाइस/फ़ाइल + ऑफ़सेट प्रदान करके पारदर्शी रूप से। – grasbueschel

+0

ऐसा लगता है कि आपको 512 जीबी स्वैप की आवश्यकता होगी ... मैं लोगों को मजाक कर रहा हूं, जीज़ ... –

उत्तर

1

मैं "बड़े फ़ाइल समर्थन" के साथ "फ़्रेमयुक्त एमएमएपी" का उपयोग करूंगा जो अब से लिनक्स का हिस्सा है। Wikipedia आलेख से प्रारंभ करें और फिर तकनीकी विवरण within the SuSE web site पर जाएं।

some examples ऑनलाइन और कुछ उत्तर herestackoverflow पर भी हैं। मुझे नहीं लगता कि आप आसानी से कुछ पूर्व-पकाया पुस्तकालय ढूंढ सकते हैं। उपरोक्त लिंक सुझावों की तरह, बड़ी मल्टीमीडिया फ़ाइलों को संभालने वाले सॉफ़्टवेयर के लिए स्रोत कोड सहायक हो सकता है, और उनकी "फ़्रेमयुक्त" प्रकृति कुछ दिलचस्प स्निपेट का कारण बन सकती है।

संबंधित मुद्दे