Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

जाओ JSON डिकोडिंग बहुत धीमी है। इसे करने का एक बेहतर तरीका क्या होगा?

बड़े JSON डेटा को पार्स करना जितना धीमा होना चाहिए, उससे कहीं अधिक धीमा प्रतीत होता है। कारण को इंगित करना और गो लेखकों को एक पैच सबमिट करना सार्थक होगा।

इस बीच, यदि आप JSON से बच सकते हैं और बाइनरी प्रारूप का उपयोग कर सकते हैं, तो आप न केवल इस समस्या से बचेंगे; आप उस समय को भी प्राप्त करेंगे जब आपका कोड संख्याओं के ASCII दशमलव निरूपण को उनके बाइनरी IEEE 754 समकक्षों में पार्स करने में खर्च कर रहा है (और ऐसा करते समय संभवतः राउंडिंग त्रुटियों का परिचय दे रहा है।)

यदि आपका प्रेषक और प्राप्तकर्ता दोनों गो में लिखे गए हैं, तो मेरा सुझाव है कि गो के बाइनरी प्रारूप का उपयोग करें:gob

एक त्वरित परीक्षण करना, 2000 प्रविष्टियों के साथ एक नक्शा बनाना, प्रत्येक 1050 साधारण फ़्लोट्स के साथ एक टुकड़ा, मुझे 20 एमबी JSON देता है, जो मेरी मशीन पर पार्स करने के लिए 1.16 सेकंड लेता है।

इन त्वरित बेंचमार्क के लिए, मैं तीन रन में से सर्वश्रेष्ठ लेता हूं, लेकिन मैं केवल वास्तविक पार्सिंग समय को मापने के लिए सुनिश्चित करता हूं, t0 := time.Now() के साथ Unmarshal कॉल और प्रिंटिंग से पहले time.Now().Sub(t0) इसके बाद।

GOB का उपयोग करके, उसी मानचित्र के परिणामस्वरूप 18 MB डेटा प्राप्त होता है, जिसे पार्स करने में 115 ms लगते हैं:
दसवां बार

आपके पास कितने वास्तविक फ़्लोट हैं, इसके आधार पर आपके परिणाम अलग-अलग होंगे। यदि आपके फ़्लोट्स में बहुत सारे महत्वपूर्ण अंक हैं, जो उनके फ्लोट64 प्रतिनिधित्व के योग्य हैं, तो 20 एमबी JSON में मेरे दो मिलियन फ़्लोट्स से बहुत कम होंगे। उस स्थिति में JSON और GOB के बीच का अंतर हमेशा गहरा होगा।

BTW, यह साबित करता है कि समस्या वास्तव में JSON पार्सर में है, न कि पार्स करने के लिए डेटा की मात्रा में, न ही बनाने के लिए मेमोरी स्ट्रक्चर में (क्योंकि दोनों परीक्षण ~ 20 एमबी डेटा को पार्स कर रहे हैं और फ़्लोट्स के समान स्लाइस को फिर से बना रहे हैं।) JSON में स्ट्रिंग्स के साथ सभी फ़्लोट्स को बदलने से मुझे 1.02 सेकंड का पार्सिंग समय मिलता है, यह पुष्टि करते हुए कि स्ट्रिंग प्रतिनिधित्व से बाइनरी फ़्लोट्स में रूपांतरण में एक निश्चित समय लगता है (बस बाइट्स को इधर-उधर करने की तुलना में) लेकिन मुख्य अपराधी नहीं है।

यदि प्रेषक और पार्सर दोनों गो नहीं हैं, या यदि आप GOB से भी आगे प्रदर्शन को निचोड़ना चाहते हैं, तो आपको अपने स्वयं के अनुकूलित बाइनरी प्रारूप का उपयोग करना चाहिए, या तो प्रोटोकॉल बफ़र्स का उपयोग करना चाहिए या मैन्युअल रूप से "एन्कोडिंग/बाइनरी" और दोस्तों के साथ।

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. redis.conf में maxmemory पैरामीटर

  2. CentOS 8 पर रेडिस स्थापित करना

  3. सबसे कुशल नोड.जेएस अंतर-प्रक्रिया संचार पुस्तकालय/विधि क्या है?

  4. मैं विभिन्न बंदरगाहों पर एक सर्वर पर रेडिस कैसे चला सकता हूं?

  5. Redis से कई प्रमुख मान प्राप्त करना