in src/annoylib.h [1012:1035]
bool on_disk_build(const char* file, char** error=NULL) {
_on_disk = true;
#ifndef _MSC_VER
_fd = open(file, O_RDWR | O_CREAT | O_TRUNC, (int) 0600);
#else
_fd = _open(file, _O_RDWR | _O_CREAT | _O_TRUNC, (int) 0600);
#endif
if (_fd == -1) {
set_error_from_errno(error, "Unable to open");
_fd = 0;
return false;
}
_nodes_size = 1;
if (ftruncate(_fd, ANNOYLIB_FTRUNCATE_SIZE(_s) * ANNOYLIB_FTRUNCATE_SIZE(_nodes_size)) == -1) {
set_error_from_errno(error, "Unable to truncate");
return false;
}
#ifdef MAP_POPULATE
_nodes = (Node*) mmap(0, _s * _nodes_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, _fd, 0);
#else
_nodes = (Node*) mmap(0, _s * _nodes_size, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0);
#endif
return true;
}