2013-03-23 2 views
9

में आईपी पता सहेजें वर्तमान में एक आईपी पता सहेजने के लिए मैं इसे संख्या में परिवर्तित कर रहा हूं और इसे संग्रह में संग्रहीत कर रहा हूं। मूल रूप से मैं इसे लॉगिंग उद्देश्यों के लिए कर रहा हूं। इसका मतलब है कि मैं जितनी जल्दी हो सके और छोटी मात्रा में जानकारी के साथ जानकारी स्टोर करना चाहता हूं।mongoDB

मैं शायद ही कभी पूछताछ के लिए इसका उपयोग करूँगा।

मेरे विचारों कि

  • तारों के रूप में भंडारण सुनिश्चित करें अक्षम के लिए है।
  • 4 अंकों के रूप में भंडारण धीमा हो जाएगा और अधिक जगह ले जाएगा।

फिर भी मुझे लगता है कि यह एक पर्याप्त विधि है, लेकिन क्या मेरे उद्देश्य के लिए कोई बेहतर है?

+2

4 इंच आईपीवी 6 पते के लिए काम नहीं करेंगे। 4 अंक * स्ट्रिंग की तुलना में अधिक जगह नहीं ले पाएंगे। ईमानदारी से, आपको यह तय करना होगा कि स्रोत स्ट्रिंग या स्पेस लॉस से कनवर्ट करना अधिक महत्वपूर्ण है और उस पर आधारित निर्णय लेना है। – Joe

+1

क्या आपको परिणामी संरचना से पूछताछ करने की आवश्यकता है? अगर यह अन्य डेटाबेस लेखन संचालन के साथ प्रतिस्पर्धा कर रहा है तो लॉगिंग के लिए मोंगोडीबी सबसे अच्छा विकल्प नहीं हो सकता है।विकल्पों का प्रयास करें और देखें कि वे कैसे प्रदर्शन करते हैं। संग्रह के लिए 'आंकड़े' देखें (http://docs.mongodb.org/manual/reference/collection-statistics/) यह देखने के लिए कि औसत दस्तावेज़ कितने बड़े हैं। आप कई छोटे व्यक्तिगत दस्तावेजों को लिखने के बजाय मेमोरी बफरिंग में कुछ भी करना चाह सकते हैं। – WiredPrairie

+0

आपको स्ट्रिंग में कनवर्ट करना चाहिए और इसे स्टोर करना चाहिए। – Abhishek

उत्तर

10

निश्चित रूप से, संख्या के रूप में आई पी पतों को बचाने के लिए यदि आप काम है कि यह लेता है की अतिरिक्त बिट कोई आपत्ति नहीं है, खासकर अगर आप उन पतों पर प्रश्नों करने की जरूरत है और आप बड़े टेबल/संग्रह।

भंडारण

  • एक IPv4 पता 4 बाइट है अगर अहस्ताक्षरित पूर्णांक के रूप में जमा:

    यहां इसका कारण बताया।

  • बिंदीदार ऑक्टेटेड फॉर्म में स्ट्रिंग के रूप में लिखे जाने पर एक आईपीवी 4 पता 10 बाइट्स और 18 बाइट्स के बीच बदलता है। (आइए मान लें कि औसत 14 बाइट्स है।)

यह वर्णों के लिए 7-15 बाइट्स है, साथ ही 2-3 बाइट्स यदि आप एक परिवर्तनीय लंबाई स्ट्रिंग प्रकार का उपयोग कर रहे हैं, जो डेटाबेस पर आधारित भिन्न होता है, फिर से उपयोग कर रहे हैं। यदि आपके पास एक निश्चित लंबाई स्ट्रिंग प्रस्तुति उपलब्ध है, तो आपको 15-वर्णित निश्चित चौड़ाई फ़ील्ड का उपयोग करना होगा।

डिस्क संग्रहण सस्ता है, इसलिए यह अधिकांश उपयोग मामलों में कारक नहीं है। हालांकि, मेमोरी उतनी सस्ता नहीं है, और यदि आपके पास बड़ी टेबल/संग्रह है और आप तेज़ प्रश्न पूछना चाहते हैं, तो आपको एक इंडेक्स चाहिए। स्ट्रिंग एन्कोडिंग के 2-3x स्टोरेज पेनल्टी में इंडेक्स निवासी को स्मृति में रखते हुए आप रिकॉर्ड कर सकते हैं रिकॉर्ड की मात्रा को कम कर देता है।

  • एक आईपीवी 6 पता 16 बाइट्स है जो एक हस्ताक्षरित पूर्णांक के रूप में संग्रहीत किया जाता है। (आपके प्लेटफ़ॉर्म के आधार पर, एकाधिक 4 या 8 बाइट पूर्णांक के रूप में।)
  • संक्षिप्त आईएक्स नोटेशन में स्ट्रिंग के रूप में एन्कोड किए जाने पर एक आईपीवी 6 पता 6 बाइट से 42 बाइट तक होता है।

कम अंत में, एक लूप बैक पता (:: 1) 3 बाइट्स और चर लंबाई लंबाई स्ट्रिंग ओवरहेड है। उच्च अंत में, 2002:4559:1FE2:1FE2:4559:1FE2:4559:1FE2 जैसे पते 39 बाइट्स और परिवर्तनीय लंबाई स्ट्रिंग ओवरहेड का उपयोग करते हैं।

आईपीवी 4 के विपरीत, यह मानना ​​सुरक्षित नहीं है कि औसत आईपीवी 6 स्ट्रिंग लंबाई 6 और 42 का मतलब होगी, क्योंकि लगातार ज़ीरो की एक बड़ी संख्या वाले पते की संख्या समग्र आईपीवी 6 पता स्थान का एक बहुत छोटा हिस्सा है।लूपबैक और ऑटोकॉन्फ पते जैसे कुछ विशेष पते, इस तरह से संपीड़ित होने की संभावना है।

फिर से, यह स्ट्रिंग एन्कोडिंग बनाम पूर्णांक एन्कोडिंग के लिए 2x का भंडारण जुर्माना है।

नेटवर्क मठ

आप तारों के रूप में लगता है रूटर दुकान IP पते है? बेशक वे नहीं करते हैं।

यदि आपको आईपी पते पर नेटवर्क गणित करने की आवश्यकता है, तो स्ट्रिंग का प्रतिनिधित्व एक परेशानी है। जैसे यदि आप एक प्रश्न लिखना चाहते हैं जो एक विशिष्ट सबनेट पर सभी पते की खोज करता है ("10.7.200.104/27 में आईपी पते के साथ सभी रिकॉर्ड लौटाएं", तो आप एक पूर्णांक सबनेट मास्क के साथ एक पूर्णांक पते को मास्क करके आसानी से ऐसा कर सकते हैं। (मोंगो इस विशेष प्रश्न का समर्थन नहीं करता है, लेकिन अधिकांश आरडीबीएमएस करते हैं।) यदि आप तारों को तारों के रूप में संग्रहीत करते हैं, तो आपकी क्वेरी को प्रत्येक पंक्ति को एक पूर्णांक में परिवर्तित करने की आवश्यकता होगी, फिर इसे मुखौटा करें, जो परिमाण धीमी गति के कई आदेश हैं। (बिटवाई मास्किंग एक आईपीवी 4 पते के लिए 2 रजिस्टरों का उपयोग करके कुछ सीपीयू चक्रों में किया जा सकता है। स्ट्रिंग को एक पूर्णांक में कनवर्ट करने के लिए स्ट्रिंग पर लूपिंग की आवश्यकता होती है।)

इसी तरह, रेंज क्वेरीज ("सभी रिकॉर्ड 1 9 2.168.1.50 और 1 9 2.168 के बीच रिकॉर्ड करें .50.100 ") पूर्णांक पते के साथ इंडेक्स का उपयोग करने में सक्षम होंगे, जबकि स्ट्रिंग पतों पर रेंज क्वेरी नहीं होगी।

बॉटम लाइन

यह बहुत थोड़ा और अधिक काम लेता है, लेकिन नहीं (देखते हैं एक लाख ATON() और ntoa() फ़ंक्शन वहाँ बाहर) है, लेकिन आप कुछ गंभीर और ठोस निर्माण कर रहे हैं, तो और आप भविष्य की आवश्यकताओं और बड़े डेटासेट की संभावना के मुकाबले इसे भविष्य में प्रमाणित करना चाहते हैं, आपको आईपी पते को पूर्णांक के रूप में स्टोर करना चाहिए, स्ट्रिंग नहीं।

यदि आप कुछ त्वरित और गंदे कर रहे हैं और भविष्य में रीमेडलिंग की संभावना को ध्यान में रखें, तो स्ट्रिंग का उपयोग करें।

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

0

एक आईपीवी 4 चार बाइट्स है, इसलिए आप इसे 32-बिट पूर्णांक (बीएसओएन प्रकार 16) में स्टोर कर सकते हैं।

, देखें http://docs.mongodb.org/manual/reference/bson-types

+1

मुझे लगता है कि आपने मेरा प्रश्न नहीं पढ़ा है। मुझे पता है कि मैं उन्हें इस तरह से स्टोर कर सकता हूं और मैंने इसे पहले से ही प्रश्न में लिखा है। मैं एक और विस्तृत उत्तर की तलाश में हूं, फिर केवल एक-लाइनर जिसे आप उन्हें पूर्णांक के रूप में स्टोर कर सकते हैं। –

+0

मैंने इसे पढ़ा था। आप सवाल उठाते हैं जैसे 'मैंने इसे सबसे अच्छा तरीका किया, लेकिन और क्या बेहतर होगा?'। तो मूल रूप से मेरा जवाब कहता है 'हाँ मुझे लगता है कि यह सबसे अच्छा तरीका है'। और इस तरह के एक साधारण जवाब के लिए एक किताब लिखने की जरूरत नहीं है। –

-1

IPv4 के लिए सरल तरीका here प्रदान किए गए दिलचस्प गणित का उपयोग करके int में कनवर्ट करना है।

मैं निम्नलिखित समारोह (जे एस) का उपयोग db

ipv4Number: function (ip) { 
    iparray = ip.split("."); 
    ipnumber = parseInt(iparray[3]) + 
     parseInt(iparray[2]) * 256 + 
     parseInt(iparray[1]) * Math.pow(256, 2) + 
     parseInt(iparray[0]) * Math.pow(256, 3); 
    if (parseInt(ipnumber) > 0)return ipnumber; 
    return 0; 
} 
+2

ऐसा करने का बिल्कुल कोई मतलब नहीं है, क्योंकि अधिकांश भाषाओं में मूल कार्य होता है जो वास्तव में कुछ ऐसा ही कर रहा है। यह भी सवाल आईपी को पूर्णांक में परिवर्तित करने के बारे में नहीं था। –

1

के साथ एक पूर्णांक के रूप में एक आईपी पते को बचाने के लिए एक कारगर तरीका मिलान से पहले कन्वर्ट करने के लिए। यदि आप एक आईपी को सिडर फ़िल्टर के साथ टैग करना चाहते हैं, तो यहां एक डेमो:

> db.getCollection('iptag').insert({tags: ['office'], hostmin: 2886991873, hostmax: 2887057406, cidr: '172.20.0.0/16'}) 
> db.getCollection('iptag').insert({tags: ['server'], hostmin: 173867009, hostmax: 173932542, cidr: '10.93.0.0/16'}) 
> db.getCollection('iptag').insert({tags: ['server'], hostmin: 173932545, hostmax: 173998078, cidr: '10.94.0.0/16'}) 

टैग अनुक्रमणिका बनाएं।

> db.getCollection('iptag').ensureIndex(tags: 1) 

सीडर श्रेणी के साथ फ़िल्टर आईपी। ip2int('10.94.25.32') == 173938976

> db.getCollection('iptag').find({hostmin: {$lte: 173938976}, hostmax: {$gte: 173938976}})