9be14bbf98fbe84c898cf038fa80c3f9124a2ee6 markd Sat Jan 11 13:29:12 2020 -0800 added madvise call after mmap to improve performance diff --git src/gfServer/gfServer.c src/gfServer/gfServer.c index 53a6f75..b12a7fd 100644 --- src/gfServer/gfServer.c +++ src/gfServer/gfServer.c @@ -734,34 +734,36 @@ } void loadGenoFindIndex(char *fileName, struct genoFind **gfRet, struct genoFind *transGf[2][3]) /* load indexes from file. Only one of gfRet or transGf is set. */ { FILE *f = mustOpen(fileName, "r"); char fileMagic[sizeof(indexMagic) + 1]; mustRead(f, fileMagic, sizeof(indexMagic)); fileMagic[sizeof(indexMagic)] = '\0'; if (strcmp(fileMagic, indexMagic)) errAbort("wrong magic string for index file"); boolean isTrans; mustRead(f, &isTrans, sizeof(isTrans)); if (doTrans != isTrans) errAbort("index file isTrans==%d and -trans==%d", isTrans, doTrans); -void *memMapped = mmap(NULL, fileSize(fileName), PROT_READ, MAP_SHARED, fileno(f), 0); +off_t fsize = fileSize(fileName); +void *memMapped = mmap(NULL, fsize, PROT_READ, MAP_SHARED, fileno(f), 0); if (memMapped == MAP_FAILED) - errnoAbort("mmap of index file failed"); - + errnoAbort("mmap of index file failed: %s", fileName); +if (madvise(memMapped, fsize, MADV_RANDOM | MADV_WILLNEED) < 0) + errnoAbort("madvise of index file failed: %s", fileName); if (doTrans) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) transGf[i][j] = loadGenoFind(f, memMapped); } else { *gfRet = loadGenoFind(f, memMapped); } carefulClose(&f); }