2009-02-07 14 views
13

मैं डिस्क पर फ़ाइल में अलग श्रृंखला के साथ हैश तालिका कैसे स्टोर कर सकता हूं?फ़ाइल में हैश तालिका कैसे स्टोर करें?

रनटाइम पर हैश तालिका में संग्रहीत डेटा जेनरेट करना महंगा है, डिस्क से एचटी लोड करना तेज़ होगा ... अगर मैं केवल यह समझ सकूं कि इसे कैसे किया जाए।

संपादित करें: लुकअप एचटी में लोड एचटी के साथ किया जाता है। मुझे हैशटेबल (मेमोरी में) को कुछ बाइनरी प्रारूप में फ़ाइल में स्टोर करने का एक तरीका ढूंढना होगा। तो अगली बार जब प्रोग्राम चलता है तो यह केवल एचटी डिस्क को डिस्क में लोड कर सकता है।

मैं सी ++ का उपयोग कर रहा हूं।

+0

क्या आप डिस्क से लुकअप कर रहे हैं या आपको केवल हैशटेबल को जारी रखने की आवश्यकता है? – Hank

+0

हैंक, लुकअप एचटी में लोड एचटी के साथ किया जाता है। हाँ, मुझे बस हैशटेबल को बनाए रखने की जरूरत है। – Girish

+0

कृपया अधिक जानकारी प्रदान करें - भाषा, सिस्टम, आदि –

उत्तर

6

आप किस भाषा का उपयोग कर रहे हैं? सामान्य विधि कुछ प्रकार के द्विआधारी क्रमिकरण करना है।

ठीक है, मुझे लगता है कि आपने भाषा जोड़ने के लिए संपादित किया है। सी ++ के लिए कुछ विकल्प हैं। मेरा मानना ​​है कि बूस्ट सीरियलाइजेशन तंत्र बहुत अच्छा है। इसके अलावा, बूस्ट की धारावाहिक पुस्तकालय के लिए पृष्ठ विकल्पों का भी वर्णन करता है। यहाँ लिंक है:

http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html

+0

> आप किस भाषा का उपयोग कर रहे हैं? मैं सी ++ का उपयोग कर रहा हूं। > सामान्य विधि कुछ प्रकार की बाइनरी क्रमबद्धता करना है। क्या आप इस पर विस्तृत जानकारी दे सकते हैं? मुझे बाइनरी क्रमबद्धता के बारे में पता नहीं है। मैं यह भी जोड़ना चाहता हूं कि यह मेरे लिए एक सीखने का अभ्यास भी है, इसलिए मैं इसे सब कुछ हाथ से करना चाहता हूं। :) – Girish

5

मान लिया जाये कि C/C++: सरणी अनुक्रमित उपयोग और निश्चित आकार structs के बजाय संकेत और चर लंबाई आवंटन। आपको बाद में पढ़ने() आईएनजी के लिए फ़ाइल संरचनाओं को सीधे लिखने में सक्षम होना चाहिए।

किसी भी उच्च स्तर के लिए: बहुत अधिक भाषा एपीआई में क्रमबद्धता सुविधाएं होती हैं। जावा और क्यूटी/सी ++ दोनों में ऐसे तरीके हैं जो तुरंत दिमाग में फिसलते हैं, इसलिए मैं दूसरों को भी जानता हूं।

2

शायद DBM आपके लिए उपयोग किया जा सकता है।

+0

क्या आपने उस पर लाइसेंसिंग की जांच की है? या तो आप अपना ऐप ओपन सोर्स बनाते हैं, या आप स्लीपैकैट की बजाय खड़ी (किसी भी बड़े निगम के लिए) लाइसेंस शुल्क का भुगतान करते हैं। –

5

आप सीरियलाइजेशन (उदा। in Java) का उपयोग करके पूरी डेटा संरचना को डिस्क पर सीधे लिख सकते हैं। हालांकि, आपको अपने तत्वों तक पहुंचने के लिए पूरी वस्तु को स्मृति में वापस पढ़ने के लिए मजबूर होना पड़ सकता है। यदि यह व्यावहारिक नहीं है, तो आप हैश तालिका के तत्वों को संग्रहीत करने के लिए random access फ़ाइल का उपयोग करने पर विचार कर सकते हैं। श्रृंखला में अगले तत्व का प्रतिनिधित्व करने के लिए पॉइंटर का उपयोग करने के बजाय, आप फ़ाइल में बाइट स्थिति का उपयोग करेंगे।

+0

जैच, <असंबंधित प्रश्न> मैं स्टैक ओवरफ़्लो के लिए अभी भी नया हूं, मैं अलग-अलग पोस्ट का जवाब कैसे दे सकता हूं? क्या यह एक पोस्ट बनाने के लिए संभव/वांछनीय है ताकि यह अन्य लोगों के पदों (उत्तर) के साथ दिखाई दे या मुझे टिप्पणियों के माध्यम से अलग-अलग पदों का जवाब देना चाहिए ("टिप्पणी जोड़ें")? – Girish

+0

@ गिरिश: समुदाय में आपका स्वागत है =) यदि आपकी प्रतिक्रिया संक्षिप्त और पोस्ट के लिए विशिष्ट है, तो बस एक टिप्पणी जोड़ें। लंबे प्रतिक्रियाएं जो दूसरों के लिए उपयोगी हो सकती हैं मूल प्रश्न में होनी चाहिए ("संपादित करें" पर क्लिक करें)। किसी नए उत्तर के रूप में कभी भी प्रतिक्रिया या अतिरिक्त जानकारी पोस्ट न करें (क्योंकि यह एक नहीं है)। –

+0

समझ गया, धन्यवाद। एक यादृच्छिक अभिगम फ़ाइल द्वारा आपका मतलब है कि फ़ाइल को fseek() 'ing? ... निश्चित नहीं। – Girish

1

यदि आपके हैश टेबल कार्यान्वयन कोई अच्छा है, तो बस हैश और प्रत्येक ऑब्जेक्ट के डेटा को स्टोर करें - तालिका में ऑब्जेक्ट डालने से हैश को महंगा नहीं होना चाहिए, और टेबल या चेन को क्रमबद्ध करने से आपको सीधे बदलना पड़ता है बचत और लोड के बीच सटीक कार्यान्वयन।

3

सूचकांक के लिए पॉइंटर्स को हटाएं।

यह ऑन-डिस्क DAWG पर निर्माण करने के समान ही है, जिसे मैंने कुछ समय पहले किया था। इतना इतना मीठा क्या था कि इसे फ़ाइल पढ़ने के बजाय सीधे एमएमएपी के साथ लोड किया जा सकता था। अगर हैश अंतरिक्ष प्रबंधनीय है, का कहना है कि 2 या 2 प्रविष्टियों, तो मुझे लगता है कि मैं कुछ इस तरह करना होगा:

  • मुक्त सूचकांकों की एक सूची रखें। (यदि तालिका खाली है, तो प्रत्येक श्रृंखला-सूचकांक अगले सूचकांक पर इंगित करेगा।)
  • जब चेनिंग की आवश्यकता होती है तो तालिका में खाली स्थान का उपयोग करें।
  • आप एक सूचकांक कि एक squatter (कहीं और से अतिप्रवाह) के कब्जे में है में कुछ डाल करने के लिए की जरूरत है:
    • रिकॉर्ड सूचकांक
    • स्वैप (इसे एन कॉल) नए तत्व और अनधिवासी
    • स्क्वाटर को एक नई मुक्त इंडेक्स में रखें, (एफ)।
    • अनधिवासी के हैश सूचकांक पर श्रृंखला का पालन करें, तो आप पूरी तरह से मुक्त सूचकांक समाप्त हो जाता है एफ
  • साथ एन को बदलने के लिए, तो आप शायद एक बड़ा टेबल की जरूरत है, लेकिन आप mremap का उपयोग करके थोड़ी देर सामना कर सकते हैं टेबल के बाद अतिरिक्त कमरा बनाने के लिए।

इससे आपको संशोधन के बिना सीधे तालिका को एमएमएपी और उपयोग करने की अनुमति देनी चाहिए। (ओएस कैश में डरावना तेज़!) लेकिन आपको पॉइंटर्स के बजाय इंडेक्स के साथ काम करना होगा। सिग्कॉल-राउंड-ट्रिप-टाइम में मेगाबाइट्स उपलब्ध कराने के लिए यह बहुत डरावना है, और अभी भी इसे पेजिंग के कारण भौतिक स्मृति में उससे कम लेना है।

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