मैंने PHP में JSON को एक कस्टम बाइनरी फॉर्मेट से बदल दिया
हमें वेब और मोबाइल ऐप्स के लिए रिच टेक्स्ट स्टोर करने की आवश्यकता होती है।
सालों तक, हमने अपने डेटाबेस में शुद्ध HTML का उपयोग किया। बाद में, एडिटिंग को प्रिंटिंग से अलग करने के लिए हमने JSON को अपनाया।
जैसे-जैसे हमारा डेटा बढ़ा, JSON एक समस्या बन गया। एक सिंगल लिंक बदलने के लिए, हमें पूरे ऐरे को पार्स, रीबिल्ड और स्ट्रिंगिफाई करना पड़ता था। यह प्रक्रिया धीमी और अक्षम थी।
मैंने PHP का उपयोग करके एक कस्टम बाइनरी फॉर्मेट बनाने का निर्णय लिया।
यहाँ बताया गया है कि मैंने यह बदलाव क्यों किया:
- स्पीड: पार्सिंग और सर्चिंग बहुत तेज़ हो गई।
- कंट्रोल: मैं सब कुछ मेमोरी में लोड किए बिना विशिष्ट बाइट्स में बदलाव कर सकता हूँ।
- स्ट्रक्चर: मैं एक नेस्टेड ट्री से एलिमेंट्स की एक फ्लैट लिस्ट पर आ गया।
अधिकांश रिच टेक्स्ट कार्यों के लिए जटिल ट्री की आवश्यकता नहीं होती है। आपको अक्सर केवल टेक्स्ट या विशिष्ट टैग्स खोजने की आवश्यकता होती है। ऑफसेट्स के एक सरल ट्री के साथ एलिमेंट्स का एक फ्लैट स्ट्रक्चर बेहतर काम करता है।
PHP कोई लो-लेवल भाषा नहीं है। यह Zig या C की तरह बाइट मैनिपुलेशन के लिए ऑप्टिमाइज़्ड नहीं है। हालाँकि, PHP के पास सही टूल्स हैं:
pack()नंबरों या स्ट्रिंग्स को रॉ बाइट्स में बदल देता है।unpack()उन बाइट्स को वापस उपयोगी डेटा में बदल देता है।
मैंने मल्टीबाइट स्ट्रिंग फंक्शन्स का उपयोग करना बंद कर दिया। इसके बजाय, मैं बाइट्स के विशिष्ट चंक्स पढ़ता हूँ। उदाहरण के लिए, एक अनसाइंड 64-बिट इंटीजर को ठीक 8 बाइट्स की आवश्यकता होती है।
10,000 लूप्स के बाद परिणाम:
पुराना JSON एनकोडिंग: 2.18s पुराना JSON डिकोडिंग: 0.86s नया बाइनरी एनकोडिंग: 1.19s नया बाइनरी डिकोडिंग: 0.67s
बाइनरी फॉर्मेट तेज़ है। यह बड़ा भी है। यह JSON के आकार से 2 गुना और HTML के आकार से 3 गुना बड़ा है। चूँकि हम सर्वर-साइड रेंडरिंग का उपयोग करते हैं, इसलिए यह हमारे लिए मायने नहीं रखता।
यदि आप एक कस्टम फॉर्मेट बनाते हैं, तो एक नियम का पालन करें: एक स्पेसिफिकेशन लिखें। अपने फॉर्मेट को स्पष्ट रूप से डॉक्यूमेंट करें। यदि आप ऐसा नहीं करते हैं, तो आपको पछताना पड़ेगा।
इसमें एक सप्ताह का काम लगा। यह सार्थक था।
स्रोत: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok