in src/annoylib.h [1037:1078]
bool build(int q, int n_threads=-1, char** error=NULL) {
if (_loaded) {
set_error_from_string(error, "You can't build a loaded index");
return false;
}
if (_built) {
set_error_from_string(error, "You can't build a built index");
return false;
}
D::template preprocess<T, S, Node>(_nodes, _s, _n_items, _f);
_n_nodes = _n_items;
ThreadedBuildPolicy::template build<S, T>(this, q, n_threads);
// Also, copy the roots into the last segment of the array
// This way we can load them faster without reading the whole file
_allocate_size(_n_nodes + (S)_roots.size());
for (size_t i = 0; i < _roots.size(); i++)
memcpy(_get(_n_nodes + (S)i), _get(_roots[i]), _s);
_n_nodes += _roots.size();
if (_verbose) annoylib_showUpdate("has %d nodes\n", _n_nodes);
if (_on_disk) {
if (!remap_memory_and_truncate(&_nodes, _fd,
static_cast<size_t>(_s) * static_cast<size_t>(_nodes_size),
static_cast<size_t>(_s) * static_cast<size_t>(_n_nodes))) {
// TODO: this probably creates an index in a corrupt state... not sure what to do
set_error_from_errno(error, "Unable to truncate");
return false;
}
_nodes_size = _n_nodes;
}
D::template postprocess<T, S, Node>(_nodes, _s, _n_items, _f);
_built = true;
return true;
}