Рубрики
Без рубрики

Хэш-Индекс @ SwayDB

Конфигурация хэш-индекса в SwayDB. Помеченный как java, scala, постоянный, хранилище.

Хэш-индексы повышают производительность случайного чтения на 55%!

Хэш-индексы типа HashSet или HashMap полезны для обслуживания случайных запросов на чтение. Они повышают производительность при случайном доступе к данным, сокращают общее количество операций ввода-вывода и экономят процессорное время. Но они также могут быть дорогостоящими для приложений, которые редко выполняют случайные чтения, такие как

  • Данные временных рядов или источника событий могут требовать только быстрого последовательного чтения.
  • Холодное хранение или архивированные данные могут вообще не требовать случайного чтения.

Для Sway DB требуется настраиваемый хэш-индекс, чтобы можно было обрабатывать различные требования к хранению данных. Ниже были изложены требования:

  • Необязательно включать или отключать хэш-индекс.
  • Позволяют создавать идеальные или почти идеальные хэш-индексы.
  • Создавайте частично индексированные хэш-индексы с возможностью возврата к альтернативным индексам, таким как двоичный поиск и линейный поиск.
  • Скопируйте ключи непосредственно в хэш-индекс.
  • Контролируемый параллелизм.
  • Компрессия.

Пример конфигурации

Следующее создает постоянную Карту , где хэш-индекс отключен.

Map map =  
  MapConfig  
    .functionsOff(Paths.get("myMap"), intSerializer(), stringSerializer())  
    .setRandomKeyIndex(RandomKeyIndex.disable())  
    .get();

map.put(1, "one");  
map.get(1); //Optional[one]

Следующее включает хэш-индекс ( Индекс случайного ключа ) с пользовательской конфигурацией.

Map map =  
  MapConfig  
    .functionsOff(Paths.get("myMap"), intSerializer(), stringSerializer())  
    .setRandomKeyIndex(  
      RandomKeyIndex  
        .builder()  
        .maxProbe(10) //re-hash 10 times to resolve hash collision
        .minimumNumberOfKeys(20) //minimum keys required
        .minimumNumberOfHits(10) //minimum indexed keys required 
        //use reference format. IndexFormat.copyKeys() can also be used here
        //to copy keys directly into the hash-index
        .indexFormat(IndexFormat.reference())
        .allocateSpace(  
          (RandomKeyIndex.RequiredSpace optimalSpace) ->
            //allocates 3 times more storage than the 
            //default optimal space for higher hit rate. 
            optimalSpace.requiredSpace() * 3   
         )  
         //allow async IO for all IO operations
        .ioStrategy((IOAction ioAction) -> new IOStrategy.AsyncIO(true))  
         //Use LZ4 and fallback to Snappy.
        .compression((UncompressedBlockInfo info) ->  
          Arrays.asList(  
             //try running LZ4 with minimum 20.0% compression    
            Compression.lz4Pair(  
              new Pair(LZ4Instance.fastestInstance(), new LZ4Compressor.Fast(20.0)),  
              new Pair(LZ4Instance.fastestInstance(), LZ4Decompressor.fastDecompressor())  
            ),  
            //if LZ4 fails try Snappy with 20.0% compression.    
            new Compression.Snappy(20.0)  
         )  
       )  
    )  
    .get();

map.put(1, "one");  
map.get(1); //Optional[one]

Для получения подробной документации по конфигурациям обратитесь к веб-сайту documentation .

Полезные ссылки

  • SwayDB на GitHub.
  • Java примеры репозитория.
  • Kotlin примеры репо.
  • Scala примеры репозитория.
  • Веб-сайт документации – SwayDB.io .

Оригинал: “https://dev.to/simerplaha/hash-index-swaydb-4k8”