granne\*
----
[](https://crates.io/crates/granne)
[](https://docs.rs/granne)
[](LICENSE)
**granne** (**g**raph-based **r**etrieval of **a**pproximate **n**earest **ne**ighbors) is a Rust library for approximate nearest neighbor search based on [Hierarchical Navigable Small World (HNSW) graphs](https://arxiv.org/abs/1603.09320) and is used in [Cliqz Search](https://beta.cliqz.com). It focuses on reducing memory usage in order to allow [indexing billions of vectors](https://0x65.dev/blog/2019-12-07/indexing-billions-of-text-vectors.html).
## Features
- Memory-mapped
- Multithreaded index creation
- Extensible indexes (add elements to an already built index)
- Python bindings
- Dense `float` or `int8` elements (cosine distance)
## Installation
#### Requirements
You will need to have `Rust` installed. This can be done by calling:
```
Or by visiting https://rustup.rs/ and following the instructions there.
#### Rust
```
# build
cargo build --release
# test
cargo test
# bench
cargo +nightly bench
```
#### Python
See [Python Bindings](py).
#### Optional Requirements
granne can use `BLAS` (https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) to improve speed of some computations. On Debian/Ubuntu both `libblas-dev` and `libopenblas-dev` should work, with the latter being significantly faster.
`BLAS` can be enabled by passing the `blas` feature during compilation, e.g.
```
cargo build --release --features "blas"
```
On Mac OS there seems to be some issue ([maybe
this one](https://grokbase.com/t/r/r-sig-mac/106pkkknqd/problems-with-single-precision-routines-in-64-bit-veclib-blas))
with the default `BLAS` library. A workaround is to install e.g. `openblas` and link to that instead.
----
\***granne** is Swedish and means **neighbor**