ನಾನು PHP ನಲ್ಲಿ JSON ಅನ್ನು ಕಸ್ಟಮ್ ಬೈನರಿ ಫಾರ್ಮ್ಯಾಟ್ನಿಂದ ಬದಲಾಯಿಸಿದೆ
ನಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳಿಗಾಗಿ ರಿಚ್ ಟೆಕ್ಸ್ಟ್ (rich text) ಅನ್ನು ಸಂಗ್ರಹಿಸಲು ನಮಗೆ ಉತ್ತಮವಾದ ಮಾರ್ಗದ ಅಗತ್ಯವಿತ್ತು.
ಮೊದಲು, ನಾವು ನಮ್ಮ ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ರ (raw) HTML ಅನ್ನು ಸಂಗ್ರಹಿಸುತ್ತಿದ್ದೆವು. ನಂತರ, ಎಡಿಟಿಂಗ್ ಮತ್ತು ಪ್ರಿಂಟಿಂಗ್ ಅನ್ನು ಪ್ರತ್ಯೇಕಿಸಲು ನಾವು JSON ಗೆ ಬದಲಾಯಿಸಿದೆವು. JSON ಸ್ವಲ್ಪ ಸಮಯದವರೆಗೆ ಕೆಲಸ ಮಾಡಿತು, ಆದರೆ ನಾವು ಬೆಳೆದಂತೆ ಅದು ಹೊಸ ಸಮಸ್ಯೆಗಳನ್ನು ಸೃಷ್ಟಿಸಿತು.
ನಮ್ಮ ಅಗತ್ಯಗಳಿಗೆ JSON ತುಂಬಾ ನಿಧಾನವಾಯಿತು.
ಹಳೆಯ ಲಿಂಕ್ಗಳನ್ನು ಹುಡುಕಲು ಮತ್ತು ಅಪ್ಡೇಟ್ ಮಾಡಲು ನಮಗೆ ಅಗತ್ಯವಿದ್ದಾಗ, ನಾವು ಇಡೀ ಅರೇಗಳನ್ನು (arrays) ಪಾರ್ಸ್ ಮಾಡಿ ಮರುನಿರ್ಮಿಸಬೇಕಾಗುತ್ತಿತ್ತು. ಈ ಪ್ರಕ್ರಿಯೆಯು ನಿಧಾನ ಮತ್ತು ಅಸಮರ್ಥವಾಗಿತ್ತು. ಡೇಟಾ ಮ್ಯಾನಿಪ್ಯುಲೇಶನ್ ಮತ್ತು ಸ್ಟ್ರೀಮಿಂಗ್ ಅನ್ನು ವೇಗವಾಗಿ ಮಾಡಲು ಅನುವು ಮಾಡಿಕೊಡುವ ಫಾರ್ಮ್ಯಾಟ್ ನಮಗೆ ಬೇಕಾಗಿತ್ತು.
ನಾನು PHP ಬಳಸಿ ಒಂದು ಕಸ್ಟಮ್ ಬೈನರಿ ಫಾರ್ಮ್ಯಾಟ್ ಅನ್ನು ನಿರ್ಮಿಸಲು ನಿರ್ಧರಿಸಿದೆ.
ಅನೇಕ ಡೆವಲಪರ್ಗಳು PHP ಅನ್ನು ಲೋ-ಲೆವೆಲ್ ಬೈಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ಗಾಗಿ (low-level byte management) ತಯಾರಿಸಲಾಗಿಲ್ಲ ಎಂದು ಭಾವಿಸುತ್ತಾರೆ. ಆದಾಗ್ಯೂ, PHP ನಲ್ಲಿ ಇದಕ್ಕಾಗಿ ಅಂತರ್ನಿರ್ಮಿತ ಫಂಕ್ಷನ್ಗಳಿವೆ:
- pack(): ಸಂಖ್ಯೆಗಳು ಅಥವಾ ಸ್ಟ್ರಿಂಗ್ಗಳನ್ನು ರ (raw) ಬೈಟ್ಗಳಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.
- unpack(): ಆ ಬೈಟ್ಗಳನ್ನು ಮತ್ತೆ ಸಂಖ್ಯೆಗಳು ಅಥವಾ ಸ್ಟ್ರಿಂಗ್ಗಳಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ.
ನಾನು ಮಲ್ಟಿಬೈಟ್ ಸ್ಟ್ರಿಂಗ್ ಆಪರೇಷನ್ಗಳನ್ನು (multibyte string operations) ಬಳಸುವುದು ನಿಲ್ಲಿಸಿದೆ. ಬದಲಾಗಿ, ನಾನು ನಿರ್ದಿಷ್ಟ ಬೈಟ್ ಚಂಕ್ಗಳನ್ನು (chunks of bytes) ಓದುವ ಕಡೆ ಗಮನಹರಿಸಿದೆ. ಉದಾಹರಣೆಗೆ, ಅನ್ಸೈನ್ಡ್ 64-ಬಿಟ್ ಇಂಟೆಜರ್ (unsigned 64-bit integer) ಗೆ ನಿಖರವಾಗಿ 8 ಬೈಟ್ಗಳ ಅಗತ್ಯವಿದೆ. ಬೈನರಿ ಡೇಟಾದೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ ನಿಖರತೆ (precision) ಬಹಳ ಮುಖ್ಯ.
ನಾನು ಡೇಟಾವನ್ನು ರಚಿಸುವ ವಿಧಾನವನ್ನೂ ಬದಲಾಯಿಸಿದೆ.
ಹೆಚ್ಚಿನ ಜನರು ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ಆಳವಾದ, ನೆಸ್ಟೆಡ್ ಟ್ರೀ ರಚನೆಯಲ್ಲಿ (nested tree structure) ಇಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಾರೆ. ಇದು ಹೆಚ್ಚಾಗಿ ತಪ್ಪು. ನಾನು ಪಠ್ಯ (text), ಟ್ಯಾಗ್ಗಳು (tags) ಮತ್ತು ಪಟ್ಟಿಗಳಂತಹ (lists) ಎಲಿಮೆಂಟ್ಗಳ ಫ್ಲಾಟ್ ಲಿಸ್ಟ್ಗೆ (flat list) ಬದಲಾಯಿಸಿದೆ. HTML ಅನ್ನು ಮರುನಿರ್ಮಿಸಲು ನಾನು ಆಫ್ಸೆಟ್ಗಳ (offsets) ಸರಳ ಟ್ರೀ ಅನ್ನು ಬಳಸುತ್ತೇನೆ. ಇದು ಎಲ್ಲಾ ಲಿಂಕ್ಗಳನ್ನು ಹುಡುಕುವುದು ಅಥವಾ HTML ಅನ್ನು ತೆಗೆದುಹಾಕುವಂತಹ ಕೆಲಸಗಳನ್ನು ಬಹಳ ವೇಗವಾಗಿಸುತ್ತದೆ.
10,000 ಲೂಪ್ಗಳಿಂದ ಬಂದ ಫಲಿತಾಂಶಗಳು ಸ್ಪಷ್ಟ ವಿಜಯವನ್ನು ತೋರಿಸುತ್ತವೆ:
ಹಳೆಯ JSON ಎನ್ಕೋಡಿಂಗ್: 2.18s ಹಳೆಯ JSON ಡಿಕೋಡಿಂಗ್: 0.86s
ಹೊಸ ಬೈನರಿ ಎನ್ಕೋಡಿಂಗ್: 1.19s ಹೊಸ ಬೈನರಿ ಡಿಕೋಡಿಂಗ್: 0.67s
ಹೊಸ ಫಾರ್ಮ್ಯಾಟ್ ಎನ್ಕೋಡಿಂಗ್ ಮತ್ತು ಡಿಕೋಡಿಂಗ್ ಎರಡಕ್ಕೂ ವೇಗವಾಗಿದೆ.
ಬೈನರಿ ಫಾರ್ಮ್ಯಾಟ್ JSON ಅಥವಾ HTML ಗಿಂತ ದೊಡ್ಡದಾಗಿದೆ. ಇದು JSON ಗಿಂತ ಸುಮಾರು ಎರಡರಷ್ಟು ಜಾಗವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ನಾವು ಸರ್ವರ್-ಸೈಡ್ ರೆಂಡರಿಂಗ್ (server-side rendering) ಬಳಸುವುದರಿಂದ, ಈ ಸ್ಟೋರೇಜ್ ಹೆಚ್ಚಳವು ನಮ್ಮ ಕಾರ್ಯಕ್ಷಮತೆಯ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ.
ಈ ಬದಲಾವಣೆಯ ಲಾಭವು ದೊಡ್ಡದಿದೆ. ನಾವು ಈಗ ಸರಳ ಮತ್ತು ವೇಗವಾದ ಫಂಕ್ಷನ್ಗಳೊಂದಿಗೆ ಲಿಂಕ್ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು ಮತ್ತು HTML ಅನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಬಹುದು.
ನೀವು ಕಸ್ಟಮ್ ಫಾರ್ಮ್ಯಾಟ್ ಅನ್ನು ನಿರ್ಮಿಸಿದರೆ, ಸ್ಪಷ್ಟವಾದ ಸ್ಪೆಸಿಫಿಕೇಶನ್ (specification) ಅನ್ನು ಬರೆಯಿರಿ. ನೀವು ನಂತರ ಕೋಡ್ಗೆ ಮರಳಿದಾಗ ಇದು ನಿಮಗೆ ಅಗತ್ಯವಿರುತ್ತದೆ.
ಮೂಲ: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok