Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

தொடக்க பேச்சு

இந்த அறிக்கையை மாஸ்கோவில் நடந்த கோபர்கான் ரஷ்யா 2019 மாநாட்டில் ஆங்கிலத்திலும், நிஸ்னி நோவ்கோரோடில் நடந்த சந்திப்பில் ரஷ்ய மொழியிலும் கொடுத்தேன். நாங்கள் ஒரு பிட்மேப் குறியீட்டைப் பற்றி பேசுகிறோம் - பி-ட்ரீயை விட குறைவான பொதுவானது, ஆனால் குறைவான சுவாரஸ்யமானது அல்ல. பகிர்தல் பதிவு மாநாட்டில் ஆங்கிலத்தில் உரைகள் மற்றும் ரஷ்ய மொழியில் உரைப் பிரதிகள்.

ஒரு பிட்மேப் இன்டெக்ஸ் எவ்வாறு செயல்படுகிறது, அது எப்போது சிறப்பாக இருக்கும், மற்ற குறியீடுகளை விட மோசமாக இருக்கும் போது, ​​மற்றும் எந்தெந்த சந்தர்ப்பங்களில் அது அவற்றை விட கணிசமாக வேகமானது என்பதைப் பார்ப்போம்; எந்த பிரபலமான DBMS களில் ஏற்கனவே பிட்மேப் குறியீடுகள் உள்ளன என்பதைப் பார்ப்போம்; கோவில் சொந்தமாக எழுத முயற்சிப்போம். மேலும் "இனிப்புக்காக" நாங்கள் எங்கள் சொந்த அதிவேக சிறப்பு தரவுத்தளத்தை உருவாக்க ஆயத்த நூலகங்களைப் பயன்படுத்துவோம்.

எனது படைப்புகள் உங்களுக்கு பயனுள்ளதாகவும் சுவாரஸ்யமாகவும் இருக்கும் என்று நான் நம்புகிறேன். போ!

அறிமுகம்


http://bit.ly/bitmapindexes
https://github.com/mkevac/gopherconrussia2019

அனைவருக்கும் வணக்கம்! மாலை ஆறு மணி, நாங்கள் அனைவரும் மிகவும் சோர்வாக இருக்கிறோம். போரிங் டேட்டாபேஸ் இன்டெக்ஸ் தியரி பற்றி பேச சிறந்த நேரம், இல்லையா? கவலைப்படாதே, நான் இங்கேயும் அங்கேயும் மூலக் குறியீட்டின் இரண்டு வரிகளை வைத்திருப்பேன். 🙂

எல்லா நகைச்சுவைகளும் ஒருபுறம் இருக்க, அறிக்கை முழுக்க முழுக்க தகவல், எங்களுக்கு அதிக நேரம் இல்லை. எனவே ஆரம்பிக்கலாம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இன்று நான் பின்வருவனவற்றைப் பற்றி பேசுவேன்:

  • குறியீடுகள் என்ன;
  • பிட்மேப் இன்டெக்ஸ் என்றால் என்ன;
  • இது எங்கு பயன்படுத்தப்படுகிறது மற்றும் எங்கு பயன்படுத்தப்படவில்லை மற்றும் ஏன்;
  • கோவில் எளிமையான செயல்படுத்தல் மற்றும் கம்பைலருடன் சிறிது போராட்டம்;
  • கோ அசெம்பிளரில் சற்று குறைவான எளிமையானது, ஆனால் அதிக உற்பத்தி செயலாக்கம்;
  • பிட்மேப் குறியீடுகளின் "சிக்கல்கள்";
  • இருக்கும் செயலாக்கங்கள்.

எனவே குறியீடுகள் என்றால் என்ன?

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

இண்டெக்ஸ் என்பது முக்கிய தரவுகளுடன் கூடுதலாக நாங்கள் பராமரிக்கும் மற்றும் புதுப்பிக்கும் ஒரு தனி தரவு கட்டமைப்பாகும். தேடலை விரைவுபடுத்த இது பயன்படுகிறது. குறியீடுகள் இல்லாமல், தேடலுக்குத் தரவை முழுவதுமாகப் பார்க்க வேண்டும் (முழு ஸ்கேன் எனப்படும் செயல்முறை), மேலும் இந்த செயல்முறை நேரியல் அல்காரிதம் சிக்கலைக் கொண்டுள்ளது. ஆனால் தரவுத்தளங்கள் பொதுவாக பெரிய அளவிலான தரவுகளைக் கொண்டிருக்கின்றன மற்றும் நேரியல் சிக்கலானது மிகவும் மெதுவாக இருக்கும். வெறுமனே, நாம் மடக்கை அல்லது நிலையான ஒன்றைப் பெறுவோம்.

இது மிகவும் சிக்கலான தலைப்பு, நுணுக்கங்கள் மற்றும் பரிவர்த்தனைகள் நிறைந்தது, ஆனால் பல தசாப்தங்களாக தரவுத்தள மேம்பாடு மற்றும் ஆராய்ச்சியைப் பார்த்த பிறகு, தரவுத்தள குறியீடுகளை உருவாக்குவதற்கு பரவலாகப் பயன்படுத்தப்படும் சில அணுகுமுறைகள் மட்டுமே உள்ளன என்று நான் கூற தயாராக இருக்கிறேன்.

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

முதல் அணுகுமுறை, தேடல் இடத்தை படிநிலையாகக் குறைத்து, தேடல் இடத்தை சிறிய பகுதிகளாகப் பிரிப்பதாகும்.

நாம் பொதுவாக பல்வேறு வகையான மரங்களைப் பயன்படுத்தி இதைச் செய்கிறோம். ஒரு உதாரணம் உங்கள் அலமாரியில் உள்ள பொருட்களின் ஒரு பெரிய பெட்டியாக இருக்கும், அதில் வெவ்வேறு தலைப்புகளாகப் பிரிக்கப்பட்ட பொருட்களின் சிறிய பெட்டிகள் உள்ளன. உங்களுக்கு பொருட்கள் தேவைப்பட்டால், "குக்கீகள்" என்று சொல்வதை விட "மெட்டீரியல்கள்" என்று சொல்லும் பெட்டியில் தேடுவீர்கள், இல்லையா?

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

இரண்டாவது அணுகுமுறை உடனடியாக விரும்பிய உறுப்பு அல்லது உறுப்புகளின் குழுவைத் தேர்ந்தெடுக்க வேண்டும். ஹாஷ் வரைபடங்கள் அல்லது தலைகீழ் குறியீடுகளில் இதைச் செய்கிறோம். ஹாஷ் வரைபடங்களைப் பயன்படுத்துவது முந்தைய உதாரணத்தைப் போலவே உள்ளது, ஆனால் பெட்டிகளின் பெட்டிக்குப் பதிலாக, உங்கள் அலமாரியில் இறுதிப் பொருட்களின் சிறிய பெட்டிகள் உள்ளன.

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

மூன்றாவது அணுகுமுறை தேடலின் தேவையை நீக்குவதாகும். ப்ளூம் ஃபில்டர்கள் அல்லது குக்கூ ஃபில்டர்களைப் பயன்படுத்தி இதைச் செய்கிறோம். முதலில் இருப்பவர்கள் உடனடியாக பதிலைத் தருகிறார்கள், தேட வேண்டியதிலிருந்து உங்களைக் காப்பாற்றுகிறார்கள்.

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

நவீன வன்பொருள் நமக்குக் கொடுக்கும் அனைத்து சக்தியையும் முழுமையாகப் பயன்படுத்துவதே கடைசி அணுகுமுறை. பிட்மேப் குறியீடுகளில் இதைத்தான் செய்கிறோம். ஆம், அவற்றைப் பயன்படுத்தும் போது நாம் சில நேரங்களில் முழு குறியீட்டையும் பார்க்க வேண்டும், ஆனால் நாங்கள் அதை மிகவும் திறமையாக செய்கிறோம்.

நான் சொன்னது போல், தரவுத்தள குறியீடுகளின் தலைப்பு பரந்த மற்றும் சமரசங்கள் நிறைந்தது. இதன் பொருள் என்னவென்றால், சில சமயங்களில் ஒரே நேரத்தில் பல அணுகுமுறைகளைப் பயன்படுத்தலாம்: தேடலை இன்னும் விரைவுபடுத்த வேண்டுமா அல்லது அனைத்து சாத்தியமான தேடல் வகைகளையும் நாம் மறைக்க வேண்டும் என்றால்.

பிட்மேப் இன்டெக்ஸ்கள் - இன்று நான் இந்த அணுகுமுறை பற்றி பேசுவேன்.

இந்த தலைப்பில் பேச நான் யார்?

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

நான் படூவில் குழுத் தலைவராகப் பணிபுரிகிறேன் (ஒருவேளை நீங்கள் எங்களின் மற்ற தயாரிப்பான பம்பளைப் பற்றி நன்கு அறிந்திருக்கலாம்). எங்களிடம் ஏற்கனவே உலகம் முழுவதும் 400 மில்லியனுக்கும் அதிகமான பயனர்கள் உள்ளனர் மற்றும் அவர்களுக்கான சிறந்த பொருத்தத்தைத் தேர்ந்தெடுக்கும் பல அம்சங்கள் உள்ளன. பிட்மேப் குறியீடுகள் உட்பட தனிப்பயன் சேவைகளைப் பயன்படுத்தி இதைச் செய்கிறோம்.

பிட்மேப் இன்டெக்ஸ் என்றால் என்ன?

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
பிட்மேப் குறியீடுகள், பெயர் குறிப்பிடுவது போல, தேடல் குறியீட்டை செயல்படுத்த பிட்மேப்கள் அல்லது பிட்செட்களைப் பயன்படுத்துகின்றன. பறவையின் பார்வையில் இருந்து, இந்தக் குறியீட்டில் ஒன்று அல்லது அதற்கு மேற்பட்ட பிட்மேப்கள் உள்ளன, அவை எந்த நிறுவனங்களையும் (மக்கள் போன்றவை) மற்றும் அவற்றின் பண்புகள் அல்லது அளவுருக்கள் (வயது, கண் நிறம் போன்றவை) மற்றும் பிட் செயல்பாடுகளைப் பயன்படுத்தும் அல்காரிதம் (AND, OR, NOT ) தேடல் வினவலுக்கு பதிலளிக்க.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
பல குறைந்த கார்டினாலிட்டி நெடுவரிசைகளில் ("கண் நிறம்" அல்லது "திருமண நிலை" மற்றும் "நகர மையத்திலிருந்து தூரம்" போன்ற ஏதாவது ஒன்றைக் கருதுங்கள்) வினவல்களை ஒருங்கிணைக்கும் தேடல்களுக்கு பிட்மேப் குறியீடுகள் மிகவும் பொருத்தமானவை மற்றும் மிகவும் செயல்திறன் மிக்கவை என்று நாங்கள் கூறுகிறோம். ஆனால் உயர் கார்டினாலிட்டி நெடுவரிசைகளுக்கும் அவை நன்றாக வேலை செய்கின்றன என்பதை நான் பின்னர் காட்டுகிறேன்.

பிட்மேப் குறியீட்டின் எளிய உதாரணத்தைப் பார்ப்போம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இதுபோன்ற பைனரி பண்புகளைக் கொண்ட மாஸ்கோ உணவகங்களின் பட்டியல் எங்களிடம் உள்ளது என்று கற்பனை செய்து பாருங்கள்:

  • மெட்ரோ அருகில்;
  • தனியார் பார்க்கிங் உள்ளது;
  • ஒரு வராண்டா உள்ளது (மொட்டை மாடி உள்ளது);
  • நீங்கள் ஒரு அட்டவணையை முன்பதிவு செய்யலாம் (முன்பதிவுகளை ஏற்றுக்கொள்கிறது);
  • சைவ உணவு உண்பவர்களுக்கு ஏற்றது (சைவ நட்பு);
  • விலையுயர்ந்த (விலையுயர்ந்த).

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
ஒவ்வொரு உணவகத்திற்கும் 0 முதல் தொடங்கும் வரிசை எண்ணைக் கொடுத்து 6 பிட்மேப்களுக்கு நினைவகத்தை ஒதுக்குவோம் (ஒவ்வொரு பண்புக்கும் ஒன்று). உணவகத்தில் இந்த சொத்து உள்ளதா இல்லையா என்பதைப் பொறுத்து இந்த பிட்மேப்களை விரிவுபடுத்துவோம். உணவகம் 4 க்கு வராண்டா இருந்தால், "வரண்டா உள்ளது" பிட்மேப்பில் உள்ள பிட் எண். 4 ஆனது 1 ஆக அமைக்கப்படும் (வராண்டா இல்லை என்றால், பின்னர் 0).
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இப்போது எங்களிடம் எளிமையான பிட்மேப் இன்டெக்ஸ் உள்ளது, மேலும் இதுபோன்ற கேள்விகளுக்கு பதிலளிக்க இதைப் பயன்படுத்தலாம்:

  • "சைவத்திற்கு ஏற்ற உணவகங்களைக் காட்டு";
  • "நீங்கள் ஒரு மேசையை முன்பதிவு செய்யக்கூடிய வராண்டாவுடன் மலிவான உணவகங்களை எனக்குக் காட்டுங்கள்."

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
எப்படி? பார்க்கலாம். முதல் கோரிக்கை மிகவும் எளிமையானது. நாம் செய்ய வேண்டியதெல்லாம், "சைவ நட்பு" பிட்மேப்பை எடுத்து, பிட்கள் வெளிப்படும் உணவகங்களின் பட்டியலாக மாற்றுவதுதான்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இரண்டாவது கோரிக்கை இன்னும் கொஞ்சம் சிக்கலானது. விலையில்லா உணவகங்களின் பட்டியலைப் பெற, "விலையுயர்ந்த" பிட்மேப்பில் NOT பிட்மேப்பைப் பயன்படுத்த வேண்டும், பின்னர் அதை "நான் ஒரு அட்டவணையை முன்பதிவு செய்யலாமா" பிட்மேப் மற்றும் அதன் விளைவாக "ஒரு வராண்டா உள்ளது" பிட்மேப்பைப் பயன்படுத்த வேண்டும். இதன் விளைவாக வரும் பிட்மேப்பில் எங்களின் அனைத்து நிபந்தனைகளையும் பூர்த்தி செய்யும் நிறுவனங்களின் பட்டியல் இருக்கும். இந்த எடுத்துக்காட்டில், இது யூனோஸ்ட் உணவகம் மட்டுமே.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இதில் நிறைய கோட்பாடுகள் உள்ளன, ஆனால் கவலைப்பட வேண்டாம், குறியீட்டை விரைவில் பார்ப்போம்.

பிட்மேப் குறியீடுகள் எங்கே பயன்படுத்தப்படுகின்றன?

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
கூகுள் பிட்மேப் இண்டெக்ஸ்களை கூகுள் செய்தால், 90% பதில்கள் ஏதோ ஒரு வகையில் Oracle DB உடன் தொடர்புடையதாக இருக்கும். ஆனால் மற்ற டிபிஎம்எஸ்களும் இதுபோன்ற அருமையான விஷயத்தை ஆதரிக்கலாம், இல்லையா? உண்மையில் இல்லை.

முக்கிய சந்தேக நபர்களின் பட்டியலைப் பார்ப்போம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
MySQL இன்னும் பிட்மேப் இண்டெக்ஸ்களை ஆதரிக்கவில்லை, ஆனால் இந்த விருப்பத்தைச் சேர்ப்பதற்கான ஒரு முன்மொழிவு உள்ளது (https://dev.mysql.com/worklog/task/?id=1524).

PostgreSQL பிட்மேப் குறியீடுகளை ஆதரிக்காது, ஆனால் பல பிற குறியீடுகளில் தேடல் முடிவுகளை இணைக்க எளிய பிட்மேப்கள் மற்றும் பிட் செயல்பாடுகளைப் பயன்படுத்துகிறது.

டரான்டூல் பிட்செட் குறியீடுகளைக் கொண்டுள்ளது மற்றும் அவற்றில் எளிய தேடல்களை ஆதரிக்கிறது.

ரெடிஸ் எளிமையான பிட்ஃபீல்டுகளைக் கொண்டுள்ளது (https://redis.io/commands/bitfield) அவற்றைத் தேடும் திறன் இல்லாமல்.

MongoDB இன்னும் பிட்மேப் குறியீடுகளை ஆதரிக்கவில்லை, ஆனால் இந்த விருப்பத்தை சேர்க்க வேண்டும் என்று பரிந்துரைக்கும் ஒரு முன்மொழிவும் உள்ளது. https://jira.mongodb.org/browse/SERVER-1723

மீள் தேடல் பிட்மேப்களை உள்நாட்டில் பயன்படுத்துகிறது (https://www.elastic.co/blog/frame-of-reference-and-roaring-bitmaps).

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

  • ஆனால் எங்கள் வீட்டில் ஒரு புதிய பக்கத்து வீட்டுக்காரர் தோன்றினார்: பிலோசா. இது Go இல் எழுதப்பட்ட புதிய தொடர்பு அல்லாத தரவுத்தளமாகும். இது பிட்மேப் குறியீடுகளை மட்டுமே கொண்டுள்ளது மற்றும் அனைத்தையும் அடிப்படையாகக் கொண்டது. அதைப் பற்றி சிறிது நேரம் கழித்து பேசுவோம்.

கோவில் செயல்படுத்தல்

ஆனால் பிட்மேப் குறியீடுகள் ஏன் மிகவும் அரிதாகவே பயன்படுத்தப்படுகின்றன? இந்தக் கேள்விக்குப் பதிலளிப்பதற்கு முன், Go இல் மிகவும் எளிமையான பிட்மேப் குறியீட்டை எவ்வாறு செயல்படுத்துவது என்பதை நான் உங்களுக்குக் காட்ட விரும்புகிறேன்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
பிட்மேப்கள் அடிப்படையில் வெறும் தரவுத் துண்டுகள். கோவில், இதற்கு பைட் ஸ்லைஸ்களைப் பயன்படுத்துவோம்.

ஒரு உணவகத்தின் சிறப்பியல்புக்கு எங்களிடம் ஒரு பிட்மேப் உள்ளது, மேலும் பிட்மேப்பில் உள்ள ஒவ்வொரு பிட்டும் ஒரு குறிப்பிட்ட உணவகத்தில் இந்த சொத்து உள்ளதா இல்லையா என்பதைக் குறிக்கிறது.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
எங்களுக்கு இரண்டு உதவி செயல்பாடுகள் தேவைப்படும். ரேண்டம் டேட்டா மூலம் நமது பிட்மேப்களை நிரப்ப ஒன்று பயன்படுத்தப்படும். சீரற்ற, ஆனால் ஒரு குறிப்பிட்ட நிகழ்தகவுடன் உணவகத்தில் ஒவ்வொரு சொத்து உள்ளது. உதாரணமாக, நீங்கள் ஒரு அட்டவணையை முன்பதிவு செய்ய முடியாத மாஸ்கோவில் மிகக் குறைவான உணவகங்கள் உள்ளன என்று நான் நம்புகிறேன், மேலும் சுமார் 20% நிறுவனங்கள் சைவ உணவு உண்பவர்களுக்கு ஏற்றது என்று எனக்குத் தோன்றுகிறது.

இரண்டாவது செயல்பாடு பிட்மேப்பை உணவகங்களின் பட்டியலாக மாற்றும்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
"உள் முற்றம் உள்ள மற்றும் முன்பதிவு செய்யக்கூடிய விலையில்லா உணவகங்களைக் காட்டு" என்ற கேள்விக்கு பதிலளிக்க, எங்களுக்கு இரண்டு பிட் செயல்பாடுகள் தேவை: NOT மற்றும் AND.

மிகவும் சிக்கலான மற்றும் ஆபரேட்டரைப் பயன்படுத்துவதன் மூலம் எங்கள் குறியீட்டை சிறிது எளிதாக்கலாம்.

இந்த செயல்பாடுகள் ஒவ்வொன்றிற்கும் எங்களிடம் செயல்பாடுகள் உள்ளன. அவை இரண்டும் துண்டுகளின் வழியாகச் சென்று, ஒவ்வொன்றிலிருந்தும் தொடர்புடைய கூறுகளை எடுத்து, அவற்றை ஒரு பிட் செயல்பாட்டுடன் இணைத்து, அதன் விளைவாக வரும் ஸ்லைஸில் முடிவை வைக்கவும்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இப்போது நாம் தேடல் வினவலுக்கு பதிலளிக்க எங்கள் பிட்மேப்களையும் செயல்பாடுகளையும் பயன்படுத்தலாம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
செயல்பாடுகள் மிக எளிமையாக இருந்தாலும், ஒவ்வொரு முறையும் செயல்பாடு அழைக்கப்படும்போது புதிய ஸ்லைஸைத் திருப்பித் தராமல், நிறைய பணத்தை மிச்சப்படுத்தியிருந்தாலும், செயல்திறன் அவ்வளவு அதிகமாக இல்லை.

pprof உடன் சிறிது விவரக்குறிப்பைச் செய்த பிறகு, Go கம்பைலரில் ஒரு மிக எளிமையான ஆனால் மிக முக்கியமான தேர்வுமுறை இல்லை என்பதை நான் கவனித்தேன்: செயல்பாடு இன்லைனிங்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
உண்மை என்னவென்றால், கோ கம்பைலர் துண்டுகள் வழியாக செல்லும் சுழல்களுக்கு மிகவும் பயப்படுகிறார், மேலும் அத்தகைய சுழல்களைக் கொண்ட இன்லைன் செயல்பாடுகளை திட்டவட்டமாக மறுக்கிறது.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
ஆனால் நான் பயப்படவில்லை, நல்ல பழைய நாட்களைப் போல ஒரு வளையத்திற்குப் பதிலாக கோட்டோவைப் பயன்படுத்தி கம்பைலரை ஏமாற்றலாம்.

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

மற்றும், நீங்கள் பார்க்க முடியும் என, இப்போது கம்பைலர் மகிழ்ச்சியுடன் எங்கள் செயல்பாட்டை இன்லைன் செய்யும்! இதன் விளைவாக, நாங்கள் சுமார் 2 மைக்ரோ விநாடிகளைச் சேமிக்கிறோம். மோசமாக இல்லை!

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

நீங்கள் சட்டசபை வெளியீட்டை உன்னிப்பாகக் கவனித்தால், இரண்டாவது இடையூறு எளிதாகத் தெரியும். கம்பைலர் எங்களின் ஹாட்டஸ்ட் லூப்பில் ஸ்லைஸ் எல்லைச் சரிபார்ப்பைச் சேர்த்தது. உண்மை என்னவென்றால், கோ ஒரு பாதுகாப்பான மொழி, தொகுப்பாளர் எனது மூன்று வாதங்கள் (மூன்று துண்டுகள்) வெவ்வேறு அளவுகளில் இருப்பதாக பயப்படுகிறார்கள். எல்லாவற்றிற்கும் மேலாக, இடையக வழிதல் என்று அழைக்கப்படுவதற்கான கோட்பாட்டு சாத்தியம் இருக்கும்.

அனைத்து ஸ்லைஸ்களும் ஒரே அளவில் இருப்பதைக் காட்டி கம்பைலரை உறுதி செய்வோம். எங்கள் செயல்பாட்டின் தொடக்கத்தில் ஒரு எளிய சரிபார்ப்பைச் சேர்ப்பதன் மூலம் இதைச் செய்யலாம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இதைப் பார்த்து, தொகுப்பாளர் மகிழ்ச்சியுடன் காசோலையைத் தவிர்க்கிறார், மேலும் 500 நானோ விநாடிகளைச் சேமிக்கிறோம்.

பெரிய புற்றுகள்

சரி, எங்களின் எளிய செயலாக்கத்தில் இருந்து சில செயல்திறனைக் குறைக்க முடிந்தது, ஆனால் இந்த முடிவு தற்போதைய வன்பொருளில் சாத்தியமானதை விட மிகவும் மோசமாக உள்ளது.

நாம் செய்வது எல்லாம் அடிப்படை பிட் செயல்பாடுகள் மற்றும் எங்கள் செயலிகள் அவற்றை மிகவும் திறமையாகச் செய்கின்றன. ஆனால், துரதிர்ஷ்டவசமாக, நாங்கள் எங்கள் செயலியை மிகச் சிறிய வேலைகளுடன் "ஊட்டுகிறோம்". எங்கள் செயல்பாடுகள் பைட் பைட் அடிப்படையில் செயல்பாடுகளைச் செய்கின்றன. UInt8 ஸ்லைஸ்களைப் பயன்படுத்தி 64-பைட் துகள்களுடன் வேலை செய்ய எங்கள் குறியீட்டை மிக எளிதாக மாற்றலாம்.

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

நீங்கள் பார்க்க முடியும் என, இந்த சிறிய மாற்றம் எட்டு முறை தொகுதி அளவை அதிகரிப்பதன் மூலம் எங்கள் திட்டத்தை எட்டு மடங்கு வேகப்படுத்தியது. ஆதாயம் நேரியல் என்று சொல்லலாம்.

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

அசெம்பிளரில் செயல்படுத்துதல்

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
ஆனால் இது முடிவல்ல. எங்கள் செயலிகள் 16, 32 மற்றும் 64 பைட்டுகளின் துண்டுகளுடன் வேலை செய்ய முடியும். இத்தகைய "பரந்த" செயல்பாடுகள் ஒற்றை அறிவுறுத்தல் பல தரவு (SIMD; ஒரு அறிவுறுத்தல், பல தரவு) என்று அழைக்கப்படுகின்றன, மேலும் அத்தகைய செயல்பாடுகளைப் பயன்படுத்தும் குறியீட்டை மாற்றும் செயல்முறை வெக்டரைசேஷன் என்று அழைக்கப்படுகிறது.

துரதிர்ஷ்டவசமாக, கோ கம்பைலர் வெக்டரைசேஷனில் சிறப்பாக இல்லை. தற்போது, ​​கோ அசெம்பிளரைப் பயன்படுத்தி இந்த செயல்பாடுகளை கைமுறையாக எடுத்து வைப்பதுதான் கோ குறியீட்டை வெக்டரைஸ் செய்வதற்கான ஒரே வழி.

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

கோ அசெம்பிளர் ஒரு விசித்திரமான மிருகம். அசெம்பிளி மொழி என்பது நீங்கள் எழுதும் கம்ப்யூட்டரின் கட்டிடக்கலையுடன் பெரிதும் பிணைக்கப்பட்ட ஒன்று என்பதை நீங்கள் அறிந்திருக்கலாம், ஆனால் Go இல் அப்படி இல்லை. கோ அசெம்பிளர் என்பது ஐஆர்எல் (இடைநிலை பிரதிநிதித்துவ மொழி) அல்லது இடைநிலை மொழி போன்றது: இது நடைமுறையில் இயங்குதளம் சார்ந்தது. ராப் பைக் சிறப்பான ஆட்டத்தை வெளிப்படுத்தினார் அறிக்கை இந்த தலைப்பில் பல ஆண்டுகளுக்கு முன்பு டென்வரில் உள்ள கோபர்கானில்.

கூடுதலாக, Go ஒரு அசாதாரணமான திட்டம் 9 வடிவமைப்பைப் பயன்படுத்துகிறது, இது பொதுவாக ஏற்றுக்கொள்ளப்பட்ட AT&T மற்றும் Intel வடிவங்களிலிருந்து வேறுபடுகிறது.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
கோ அசெம்ப்லரை கையால் எழுதுவது மிகவும் வேடிக்கையாக இல்லை என்றே சொல்லலாம்.

ஆனால், அதிர்ஷ்டவசமாக, Go assembler ஐ எழுத உதவும் இரண்டு உயர்நிலைக் கருவிகள் ஏற்கனவே உள்ளன: PeachPy மற்றும் avo. இரண்டு பயன்பாடுகளும் முறையே பைதான் மற்றும் கோவில் எழுதப்பட்ட உயர்-நிலை குறியீட்டிலிருந்து கோ அசெம்பிளரை உருவாக்குகின்றன.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இந்தப் பயன்பாடுகள் பதிவு ஒதுக்கீடு, சுழல்கள் எழுதுதல் போன்ற விஷயங்களை எளிதாக்குகின்றன, மேலும் பொதுவாக Go இல் அசெம்பிளி புரோகிராமிங் உலகில் நுழைவதற்கான செயல்முறையை எளிதாக்குகின்றன.

நாங்கள் avo ஐப் பயன்படுத்துவோம், எனவே எங்கள் திட்டங்கள் கிட்டத்தட்ட வழக்கமான Go நிரல்களாக இருக்கும்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
Avo நிரலின் எளிய உதாரணம் இதுவாகும். எங்களிடம் ஒரு முக்கிய() செயல்பாடு உள்ளது, இது தனக்குள்ளேயே சேர்() செயல்பாட்டை வரையறுக்கிறது, இதன் பொருள் இரண்டு எண்களைச் சேர்ப்பதாகும். பெயரின் மூலம் அளவுருக்களைப் பெறுவதற்கும் இலவச மற்றும் பொருத்தமான செயலி பதிவேடுகளில் ஒன்றைப் பெறுவதற்கும் இங்கே உதவி செயல்பாடுகள் உள்ளன. ADDQ இல் காணப்படுவது போல், ஒவ்வொரு செயலி செயல்பாட்டிற்கும் avo இல் தொடர்புடைய செயல்பாடு உள்ளது. இறுதியாக, விளைந்த மதிப்பை சேமிப்பதற்கான உதவி செயல்பாட்டைக் காண்கிறோம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
go generate என்று அழைப்பதன் மூலம், avo இல் நிரலை இயக்குவோம், இதன் விளைவாக, இரண்டு கோப்புகள் உருவாக்கப்படும்:

  • கோ அசெம்பிளரில் விளைந்த குறியீட்டுடன் add.s;
  • stub.go இரண்டு உலகங்களையும் இணைக்க செயல்பாட்டு தலைப்புகளுடன்: Go and assembler.

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இப்போது அவோ என்ன செய்கிறது மற்றும் எப்படி என்பதைப் பார்த்தோம், எங்கள் செயல்பாடுகளைப் பார்ப்போம். செயல்பாடுகளின் ஸ்கேலர் மற்றும் வெக்டர் (SIMD) பதிப்புகள் இரண்டையும் நான் செயல்படுத்தினேன்.

முதலில் ஸ்கேலர் பதிப்புகளைப் பார்ப்போம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
முந்தைய எடுத்துக்காட்டில், நாங்கள் இலவச மற்றும் செல்லுபடியாகும் பொது நோக்கப் பதிவேட்டைக் கேட்கிறோம், வாதங்களுக்கான ஆஃப்செட்கள் மற்றும் அளவுகளை நாங்கள் கணக்கிட வேண்டியதில்லை. avo நமக்காக இதையெல்லாம் செய்கிறது.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
செயல்திறனை மேம்படுத்தவும், Go கம்பைலரை ஏமாற்றவும் லேபிள்கள் மற்றும் கோட்டோ (அல்லது ஜம்ப்ஸ்) பயன்படுத்தினோம், ஆனால் இப்போது அதை ஆரம்பத்திலிருந்தே செய்து வருகிறோம். புள்ளி என்னவென்றால், சுழற்சிகள் ஒரு உயர்-நிலை கருத்து. அசெம்பிளரில், எங்களிடம் லேபிள்கள் மற்றும் தாவல்கள் மட்டுமே உள்ளன.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
மீதமுள்ள குறியீடு ஏற்கனவே தெரிந்ததாகவும் புரிந்துகொள்ளக்கூடியதாகவும் இருக்க வேண்டும். நாங்கள் லேபிள்கள் மற்றும் தாவல்களுடன் ஒரு லூப்பைப் பின்பற்றுகிறோம், எங்கள் இரண்டு துண்டுகளிலிருந்து ஒரு சிறிய தரவை எடுத்து, அவற்றை ஒரு பிட் செயல்பாட்டுடன் (மற்றும் இந்த விஷயத்தில் அல்ல) இணைத்து, அதன் விளைவாக வரும் ஸ்லைஸில் முடிவை வைக்கிறோம். அனைத்து.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இறுதி அசெம்பிளர் குறியீடு இப்படித்தான் இருக்கும். நாங்கள் ஆஃப்செட்கள் மற்றும் அளவுகளை (பச்சை நிறத்தில் உயர்த்தி) கணக்கிட வேண்டியதில்லை அல்லது பயன்படுத்தப்பட்ட பதிவேடுகளை (சிவப்பு நிறத்தில் உயர்த்தி) கண்காணிக்க வேண்டியதில்லை.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
அசெம்பிளி மொழி அமலாக்கத்தின் செயல்திறனுடன், கோவில் சிறந்த செயலாக்கத்தின் செயல்திறனுடன் ஒப்பிட்டுப் பார்த்தால், அதுவும் ஒன்றுதான் என்பதை நாம் பார்க்கலாம். மேலும் இது எதிர்பார்க்கப்படுகிறது. எல்லாவற்றிற்கும் மேலாக, நாங்கள் சிறப்பு எதுவும் செய்யவில்லை - ஒரு Go கம்பைலர் என்ன செய்யும் என்பதை நாங்கள் மீண்டும் உருவாக்கினோம்.

துரதிர்ஷ்டவசமாக, அசெம்பிளி மொழியில் எழுதப்பட்ட நமது செயல்பாடுகளை இன்லைன் செய்ய கம்பைலரை கட்டாயப்படுத்த முடியாது. கோ கம்பைலரில் தற்போது அத்தகைய அம்சம் இல்லை, இருப்பினும் அதைச் சேர்க்க சில காலமாக கோரிக்கை உள்ளது.

இதனால்தான் அசெம்பிளி மொழியில் சிறிய செயல்பாடுகளால் எந்த பலனும் பெற முடியாது. நாம் பெரிய செயல்பாடுகளை எழுத வேண்டும், அல்லது புதிய கணிதம்/பிட்ஸ் தொகுப்பைப் பயன்படுத்த வேண்டும் அல்லது அசெம்பிளர் மொழியைப் புறக்கணிக்க வேண்டும்.

இப்போது நமது செயல்பாடுகளின் திசையன் பதிப்புகளைப் பார்ப்போம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இந்த உதாரணத்திற்கு, நான் AVX2 ஐப் பயன்படுத்த முடிவு செய்தேன், எனவே 32-பைட் துகள்களில் செயல்படும் செயல்பாடுகளைப் பயன்படுத்துவோம். குறியீட்டின் அமைப்பு அளவிடல் பதிப்பிற்கு மிகவும் ஒத்திருக்கிறது: அளவுருக்களை ஏற்றுதல், இலவச பகிரப்பட்ட பதிவேட்டைக் கேட்பது போன்றவை.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
ஒரு கண்டுபிடிப்பு என்னவென்றால், பரந்த திசையன் செயல்பாடுகள் சிறப்பு பரந்த பதிவேடுகளைப் பயன்படுத்துகின்றன. 32-பைட் துகள்களின் விஷயத்தில், இவை Y உடன் முன்னொட்டப்பட்ட பதிவேடுகள் ஆகும். அதனால்தான் குறியீட்டில் YMM() செயல்பாட்டைப் பார்க்கிறீர்கள். நான் 512-பிட் துண்டுகளுடன் AVX-64 ஐப் பயன்படுத்தினால், முன்னொட்டு Z ஆக இருக்கும்.

இரண்டாவது கண்டுபிடிப்பு என்னவென்றால், லூப் அன்ரோலிங் எனப்படும் மேம்படுத்தலைப் பயன்படுத்த முடிவு செய்தேன், அதாவது லூப்பின் தொடக்கத்திற்குச் செல்வதற்கு முன் கைமுறையாக எட்டு லூப் செயல்பாடுகளைச் செய்வது. இந்த மேம்படுத்தல் குறியீட்டில் உள்ள கிளைகளின் எண்ணிக்கையைக் குறைக்கிறது, மேலும் கிடைக்கும் இலவசப் பதிவுகளின் எண்ணிக்கையால் வரையறுக்கப்படுகிறது.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
சரி, செயல்திறன் பற்றி என்ன? அவள் அழகாக இருக்கிறாள்! சிறந்த Go தீர்வுடன் ஒப்பிடுகையில், நாங்கள் ஏழு மடங்கு வேகத்தை அடைந்துள்ளோம். ஈர்க்கக்கூடியது, இல்லையா?
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
ஆனால் வினவல் அட்டவணையாளருக்கு AVX-512, ப்ரீஃபெட்ச்சிங் அல்லது JIT (இன்-இன்-டைம் கம்பைலர்) ஆகியவற்றைப் பயன்படுத்துவதன் மூலம் கூட இந்தச் செயலாக்கத்தை துரிதப்படுத்தலாம். ஆனால் இது நிச்சயமாக ஒரு தனி அறிக்கைக்கான தலைப்பு.

பிட்மேப் குறியீடுகளில் சிக்கல்கள்

இப்போது நாம் ஏற்கனவே கோவில் பிட்மேப் இன்டெக்ஸின் எளிமையான செயலாக்கத்தையும், அசெம்பிளி மொழியில் அதிக உற்பத்தித் திறன் கொண்டதையும் பார்த்துவிட்டோம், பிட்மேப் குறியீடுகள் ஏன் மிகவும் அரிதாகவே பயன்படுத்தப்படுகின்றன என்பதைப் பற்றி இறுதியாகப் பேசுவோம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
பழைய ஆவணங்கள் பிட்மேப் குறியீடுகளில் மூன்று சிக்கல்களைக் குறிப்பிடுகின்றன, ஆனால் புதிய தாள்கள் மற்றும் அவை இனி பொருந்தாது என்று நான் வாதிடுகிறேன். இந்த பிரச்சனைகள் ஒவ்வொன்றிலும் நாம் ஆழமாக மூழ்க மாட்டோம், ஆனால் அவற்றை மேலோட்டமாகப் பார்ப்போம்.

உயர் கார்டினாலிட்டி பிரச்சனை

எனவே, பிட்மேப் குறியீடுகள் குறைந்த கார்டினாலிட்டி கொண்ட புலங்களுக்கு மட்டுமே பொருத்தமானவை என்று நாங்கள் கூறுகிறோம், அதாவது சில மதிப்புகள் (உதாரணமாக, பாலினம் அல்லது கண் நிறம்) கொண்டவை, மேலும் அத்தகைய புலங்களின் வழக்கமான பிரதிநிதித்துவம் (ஒன்று ஒரு மதிப்புக்கு பிட்) உயர் கார்டினாலிட்டி விஷயத்தில், அது அதிக இடத்தை எடுக்கும், மேலும், இந்த பிட்மேப் குறியீடுகள் மோசமாக (அரிதாக) நிரப்பப்படும்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
சில சமயங்களில் எண்களைக் குறிக்க நாம் பயன்படுத்தும் நிலையானது போன்ற வேறுபட்ட பிரதிநிதித்துவத்தைப் பயன்படுத்தலாம். ஆனால் சுருக்க அல்காரிதம்களின் வருகைதான் எல்லாவற்றையும் மாற்றியது. கடந்த தசாப்தங்களில், விஞ்ஞானிகள் மற்றும் ஆராய்ச்சியாளர்கள் பிட்மேப்களுக்கான அதிக எண்ணிக்கையிலான சுருக்க வழிமுறைகளைக் கொண்டு வந்துள்ளனர். அவற்றின் முக்கிய நன்மை என்னவென்றால், பிட் செயல்பாடுகளைச் செய்ய பிட்மேப்களை டிகம்ப்ரஸ் செய்ய வேண்டிய அவசியமில்லை - சுருக்கப்பட்ட பிட்மேப்களில் நேரடியாக பிட் செயல்பாடுகளைச் செய்யலாம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
சமீபத்தில், கர்ஜனை பிட்மேப்கள் போன்ற கலப்பின அணுகுமுறைகள் தோன்றத் தொடங்கியுள்ளன. அவை ஒரே நேரத்தில் பிட்மேப்களுக்கு மூன்று வெவ்வேறு பிரதிநிதித்துவங்களைப் பயன்படுத்துகின்றன - பிட்மேப்கள், வரிசைகள் மற்றும் பிட் ரன்கள் என அழைக்கப்படுபவை - மேலும் செயல்திறனை அதிகரிக்க மற்றும் நினைவக நுகர்வு குறைக்க அவற்றுக்கிடையே சமநிலை.

மிகவும் பிரபலமான பயன்பாடுகளில் கர்ஜனை பிட்மேப்களை நீங்கள் காணலாம். Go க்கான மூன்றுக்கும் மேற்பட்ட செயலாக்கங்கள் உட்பட, பல்வேறு வகையான நிரலாக்க மொழிகளுக்கு ஏற்கனவே ஏராளமான செயலாக்கங்கள் உள்ளன.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
உயர் கார்டினாலிட்டியை சமாளிக்க உதவும் மற்றொரு அணுகுமுறை பின்னிங் என்று அழைக்கப்படுகிறது. ஒரு நபரின் உயரத்தைக் குறிக்கும் புலம் உங்களிடம் இருப்பதாக கற்பனை செய்து பாருங்கள். உயரம் ஒரு மிதக்கும் புள்ளி எண், ஆனால் மனிதர்களாகிய நாம் அதை அப்படி நினைக்கவில்லை. எங்களுக்கு உயரம் 185,2 செமீ மற்றும் 185,3 செமீ வித்தியாசம் இல்லை.

ஒரே மாதிரியான மதிப்புகளை 1 செமீக்குள் குழுக்களாக தொகுக்கலாம் என்று மாறிவிடும்.

மேலும் மிகச் சிலரே 50 செ.மீ.க்கும் குறைவாகவும், 250 செ.மீ.க்கும் குறைவான உயரமும் கொண்டவர்கள் என்பதும் நமக்குத் தெரிந்தால், எல்லையற்ற கார்டினாலிட்டி கொண்ட ஒரு புலத்தை, சுமார் 200 மதிப்புகள் கொண்ட ஒரு புலமாக மாற்றலாம்.

நிச்சயமாக, தேவைப்பட்டால், கூடுதல் வடிகட்டலைப் பிறகு செய்யலாம்.

உயர் அலைவரிசை சிக்கல்

பிட்மேப் குறியீடுகளின் அடுத்த சிக்கல் என்னவென்றால், அவற்றைப் புதுப்பிப்பது மிகவும் விலை உயர்ந்ததாக இருக்கும்.

நூற்றுக்கணக்கான பிற வினவல்கள் தரவைத் தேடும் போது தரவுத்தளங்கள் தரவைப் புதுப்பிக்க முடியும். ஒரே நேரத்தில் தரவு அணுகல் அல்லது பிற பகிர்தல் சிக்கல்கள் போன்ற சிக்கல்களைத் தவிர்க்க எங்களுக்கு பூட்டுகள் தேவை. ஒரு பெரிய பூட்டு இருக்கும் இடத்தில், ஒரு சிக்கல் உள்ளது - பூட்டு சர்ச்சை, இந்த பூட்டு ஒரு தடையாக மாறும் போது.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
ஷார்டிங் அல்லது பதிப்பு செய்யப்பட்ட குறியீடுகளைப் பயன்படுத்துவதன் மூலம் இந்தச் சிக்கலைத் தீர்க்கலாம் அல்லது தவிர்க்கலாம்.

ஷார்டிங் என்பது ஒரு எளிய மற்றும் நன்கு அறியப்பட்ட விஷயம். நீங்கள் மற்ற தரவுகளைப் போலவே பிட்மேப் குறியீட்டையும் பிரிக்கலாம். ஒரு பெரிய பூட்டுக்கு பதிலாக, நீங்கள் சிறிய பூட்டுகளைப் பெறுவீர்கள், இதனால் பூட்டு சர்ச்சையிலிருந்து விடுபடுவீர்கள்.

சிக்கலைத் தீர்ப்பதற்கான இரண்டாவது வழி பதிப்பு குறியீடுகளைப் பயன்படுத்துவதாகும். தேடுவதற்கு அல்லது படிக்க நீங்கள் பயன்படுத்தும் குறியீட்டின் ஒரு நகலையும், எழுதுவதற்கு அல்லது புதுப்பிப்பதற்கும் நீங்கள் பயன்படுத்தும் ஒன்றையும் வைத்திருக்கலாம். ஒரு குறிப்பிட்ட காலத்திற்கு ஒருமுறை (உதாரணமாக, ஒவ்வொரு 100 எம்எஸ் அல்லது 500 எம்எஸ்க்கும் ஒரு முறை) நீங்கள் அவற்றை நகலெடுத்து அவற்றை மாற்றவும். நிச்சயமாக, இந்த அணுகுமுறை உங்கள் பயன்பாடு சற்று பின்தங்கிய தேடல் குறியீட்டைக் கையாளக்கூடிய சந்தர்ப்பங்களில் மட்டுமே பொருந்தும்.

இந்த இரண்டு அணுகுமுறைகளும் ஒரே நேரத்தில் பயன்படுத்தப்படலாம்: நீங்கள் துண்டாக்கப்பட்ட பதிப்பு குறியீட்டை வைத்திருக்கலாம்.

மிகவும் சிக்கலான கேள்விகள்

பிட்மேப் குறியீடுகளின் இறுதிப் பிரச்சனை என்னவென்றால், ஸ்பான் வினவல்கள் போன்ற மிகவும் சிக்கலான வினவல்களுக்கு அவை மிகவும் பொருத்தமானவை அல்ல என்று நமக்குச் சொல்லப்படுகிறது.

உண்மையில், நீங்கள் இதைப் பற்றி சிந்தித்தால், AND, OR, போன்ற பிட் செயல்பாடுகள் "ஒரு இரவுக்கு 200 முதல் 300 டாலர்கள் வரையிலான அறைக் கட்டணங்களைக் கொண்ட ஹோட்டல்களைக் காட்டு" என்ற வினவல்களுக்கு மிகவும் பொருத்தமானதல்ல.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
ஒவ்வொரு டாலர் மதிப்புக்கும் முடிவுகளை எடுத்து அவற்றை பிட்வைஸ் அல்லது செயல்பாட்டுடன் இணைப்பதே ஒரு அப்பாவி மற்றும் மிகவும் விவேகமற்ற தீர்வாக இருக்கும்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
சற்றே சிறந்த தீர்வாக குழுவாக்கத்தைப் பயன்படுத்த வேண்டும். உதாரணமாக, 50 டாலர் குழுக்களில். இது நமது செயல்முறையை 50 மடங்கு வேகப்படுத்தும்.

ஆனால் இந்த வகை கோரிக்கைக்காக பிரத்யேகமாக உருவாக்கப்பட்ட பார்வையைப் பயன்படுத்துவதன் மூலம் சிக்கல் எளிதில் தீர்க்கப்படுகிறது. அறிவியல் ஆவணங்களில் இது வரம்பு-குறியிடப்பட்ட பிட்மேப்கள் என்று அழைக்கப்படுகிறது.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
இந்தப் பிரதிநிதித்துவத்தில், சில மதிப்புகளுக்கு ஒரு பிட்டை மட்டும் அமைக்கவில்லை (உதாரணமாக, 200), ஆனால் இந்த மதிப்பையும் எல்லாவற்றையும் அதிகமாக அமைக்கவும். 200 மற்றும் அதற்கு மேல். 300: 300 மற்றும் அதற்கு மேல். மற்றும் பல.

இந்த பிரதிநிதித்துவத்தைப் பயன்படுத்தி, குறியீட்டை இரண்டு முறை பயணிப்பதன் மூலம் இதுபோன்ற தேடல் வினவலுக்கு நாம் பதிலளிக்கலாம். முதலில், அறையின் விலை குறைவாகவோ அல்லது $300 ஆகவோ இருக்கும் ஹோட்டல்களின் பட்டியலைப் பெறுவோம், பின்னர் அறையின் விலை குறைவாக இருக்கும் அல்லது $199 உள்ளவற்றை அதிலிருந்து அகற்றுவோம். தயார்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
நீங்கள் ஆச்சரியப்படுவீர்கள், ஆனால் பிட்மேப் குறியீடுகளைப் பயன்படுத்தி ஜியோக்வெரிகள் கூட சாத்தியமாகும். ஒரு வடிவியல் உருவத்துடன் உங்கள் ஒருங்கிணைப்பைச் சுற்றியுள்ள வடிவியல் பிரதிநிதித்துவத்தைப் பயன்படுத்துவதே தந்திரம். எடுத்துக்காட்டாக, Google வழங்கும் S2. எண்ணிடக்கூடிய மூன்று அல்லது அதற்கு மேற்பட்ட வெட்டுக் கோடுகளின் வடிவத்தில் உருவம் குறிப்பிடக்கூடியதாக இருக்க வேண்டும். இந்த வழியில் நமது புவிசார் வினவல்களை "இடைவெளியில்" (இந்த எண்ணிடப்பட்ட கோடுகளுடன்) பல வினவல்களாக மாற்றலாம்.

தயார் தீர்வுகள்

நான் உங்களுக்கு கொஞ்சம் ஆர்வமாக உள்ளேன் என்று நம்புகிறேன், இப்போது உங்கள் ஆயுதக் களஞ்சியத்தில் மற்றொரு பயனுள்ள கருவி உள்ளது. நீங்கள் எப்போதாவது இதுபோன்ற ஒன்றைச் செய்ய வேண்டியிருந்தால், எந்த வழியில் பார்க்க வேண்டும் என்பது உங்களுக்குத் தெரியும்.

இருப்பினும், புதிதாக பிட்மேப் குறியீடுகளை உருவாக்க அனைவருக்கும் நேரம், பொறுமை அல்லது ஆதாரங்கள் இல்லை. எடுத்துக்காட்டாக, SIMD ஐப் பயன்படுத்தி குறிப்பாக மேம்பட்டவை.

அதிர்ஷ்டவசமாக, உங்களுக்கு உதவ பல ஆயத்த தீர்வுகள் உள்ளன.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

கர்ஜிக்கும் பிட்மேப்கள்

முதலாவதாக, நான் ஏற்கனவே பேசிய அதே கர்ஜிக்கும் பிட்மேப் நூலகம் உள்ளது. நீங்கள் முழு அளவிலான பிட்மேப் குறியீட்டை உருவாக்க வேண்டிய தேவையான அனைத்து கொள்கலன்கள் மற்றும் பிட் செயல்பாடுகள் இதில் உள்ளன.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
துரதிர்ஷ்டவசமாக, இந்த நேரத்தில், Go செயலாக்கங்கள் எதுவும் SIMD ஐப் பயன்படுத்துவதில்லை, அதாவது C செயலாக்கங்களை விட Go செயலாக்கங்கள் குறைவான செயல்திறன் கொண்டவை.

பிலோசா

உங்களுக்கு உதவக்கூடிய மற்றொரு தயாரிப்பு Pilosa DBMS ஆகும், இது உண்மையில் பிட்மேப் குறியீடுகளை மட்டுமே கொண்டுள்ளது. இது ஒப்பீட்டளவில் புதிய தீர்வு, ஆனால் இது பெரும் வேகத்தில் இதயங்களை வெல்கிறது.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
Pilosa உள்நாட்டில் கர்ஜிக்கும் பிட்மேப்களைப் பயன்படுத்துகிறது மற்றும் அவற்றைப் பயன்படுத்துவதற்கான திறனை உங்களுக்கு வழங்குகிறது, நான் மேலே பேசிய அனைத்து விஷயங்களையும் எளிதாக்குகிறது மற்றும் விளக்குகிறது: குழுவாக்கம், வரம்பு-குறியீடு செய்யப்பட்ட பிட்மேப்கள், ஒரு புலத்தின் கருத்து போன்றவை.

நீங்கள் ஏற்கனவே அறிந்த கேள்விக்கு பதிலளிக்க பைலோசாவைப் பயன்படுத்துவதற்கான உதாரணத்தை விரைவாகப் பார்ப்போம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
உதாரணம் நீங்கள் முன்பு பார்த்ததைப் போலவே உள்ளது. நாங்கள் பைலோசா சேவையகத்திற்கு ஒரு கிளையண்டை உருவாக்குகிறோம், ஒரு குறியீட்டு மற்றும் தேவையான புலங்களை உருவாக்குகிறோம், பின்னர் நிகழ்தகவுகளுடன் சீரற்ற தரவுகளுடன் எங்கள் புலங்களை நிரப்புகிறோம், இறுதியாக, பழக்கமான வினவலைச் செயல்படுத்துகிறோம்.

அதன் பிறகு, "விலையுயர்ந்த" புலத்தில் NOT ஐப் பயன்படுத்துகிறோம், பின்னர் முடிவை (அல்லது அது) "மொட்டை மாடி" ​​புலம் மற்றும் "முன்பதிவுகள்" புலத்துடன் வெட்டுங்கள். இறுதியாக, இறுதி முடிவைப் பெறுகிறோம்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
எதிர்காலத்தில் இந்தப் புதிய வகைக் குறியீடு MySQL மற்றும் PostgreSQL - பிட்மேப் குறியீடுகள் போன்ற DBMSகளிலும் தோன்றும் என்று நம்புகிறேன்.
Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்

முடிவுக்கு

Go இல் பிட்மேப் குறியீடுகள்: காட்டு வேகத்தில் தேடுங்கள்
நீங்கள் இன்னும் தூங்கவில்லை என்றால், நன்றி. குறைந்த நேரத்தின் காரணமாக நான் பல தலைப்புகளில் சுருக்கமாகத் தொட வேண்டியிருந்தது, ஆனால் பேச்சு பயனுள்ளதாக இருந்தது மற்றும் ஒருவேளை ஊக்கமளிக்கும் என்று நம்புகிறேன்.

பிட்மேப் குறியீடுகள் இப்போது உங்களுக்குத் தேவை இல்லாவிட்டாலும், அவற்றைப் பற்றி தெரிந்து கொள்வது நல்லது. அவை உங்கள் கருவிப்பெட்டியில் மற்றொரு கருவியாக இருக்கட்டும்.

Go க்கான பல்வேறு செயல்திறன் நுணுக்கங்கள் மற்றும் Go கம்பைலர் இன்னும் சரியாகக் கையாளாத விஷயங்களைப் பார்த்தோம். ஆனால் ஒவ்வொரு Go ப்ரோக்ராமரும் தெரிந்துகொள்ள இது முற்றிலும் பயனுள்ளதாக இருக்கும்.

அவ்வளவுதான் நான் உங்களிடம் சொல்ல விரும்பினேன். நன்றி!

ஆதாரம்: www.habr.com

கருத்தைச் சேர்