in src/annoylib.h [1167:1222]
bool load(const char* filename, bool prefault=false, char** error=NULL) {
#ifndef _MSC_VER
_fd = open(filename, O_RDONLY, (int)0400);
#else
_fd = _open(filename, _O_RDONLY, (int)0400);
#endif
if (_fd == -1) {
set_error_from_errno(error, "Unable to open");
_fd = 0;
return false;
}
off_t size = lseek_getsize(_fd);
if (size == -1) {
set_error_from_errno(error, "Unable to get size");
return false;
} else if (size == 0) {
set_error_from_errno(error, "Size of file is zero");
return false;
} else if (size % _s) {
// Something is fishy with this index!
set_error_from_errno(error, "Index size is not a multiple of vector size. Ensure you are opening using the same metric you used to create the index.");
return false;
}
int flags = MAP_SHARED;
if (prefault) {
#ifdef MAP_POPULATE
flags |= MAP_POPULATE;
#else
annoylib_showUpdate("prefault is set to true, but MAP_POPULATE is not defined on this platform");
#endif
}
_nodes = (Node*)mmap(0, size, PROT_READ, flags, _fd, 0);
_n_nodes = (S)(size / _s);
// Find the roots by scanning the end of the file and taking the nodes with most descendants
_roots.clear();
S m = -1;
for (S i = _n_nodes - 1; i >= 0; i--) {
S k = _get(i)->n_descendants;
if (m == -1 || k == m) {
_roots.push_back(i);
m = k;
} else {
break;
}
}
// hacky fix: since the last root precedes the copy of all roots, delete it
if (_roots.size() > 1 && _get(_roots.front())->children[0] == _get(_roots.back())->children[0])
_roots.pop_back();
_loaded = true;
_built = true;
_n_items = m;
if (_verbose) annoylib_showUpdate("found %zu roots with degree %d\n", _roots.size(), m);
return true;
}