diff --git a/libraries/liblmdb/lmdb.h b/libraries/liblmdb/lmdb.h
index f6dfa60..f72869e 100644
--- a/libraries/liblmdb/lmdb.h
+++ b/libraries/liblmdb/lmdb.h
@@ -275,6 +275,8 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel
#define MDB_NOTLS 0x200000
/** don't do any locking, caller must manage their own locks */
#define MDB_NOLOCK 0x400000
+ /** don't do readahead (no effect on Windows) */
+#define MDB_NORDAHEAD 0x800000
/** @} */
/** @defgroup mdb_dbi_open Database Flags
@@ -538,6 +540,12 @@ int mdb_env_create(MDB_env **env);
* that no readers are using old transactions while a writer is
* active. The simplest approach is to use an exclusive lock so that
* no readers may be active at all when a writer begins.
+ *
#MDB_NORDAHEAD
+ * Turn off readahead. Most operating systems perform readahead on
+ * read requests by default. This option turns it off if the OS
+ * supports it. Turning it off may help random read performance
+ * when the DB is larger than RAM and system RAM is full.
+ * The option is not implemented on Windows.
*
* @param[in] mode The UNIX permissions to set on created files. This parameter
* is ignored on Windows.
diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c
index 25be748..2ebf1a9 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -3283,14 +3283,17 @@ mdb_env_map(MDB_env *env, void *addr, int newsize)
env->me_map = NULL;
return ErrCode();
}
- /* Turn off readahead. It's harmful when the DB is larger than RAM. */
+
+ if (flags & MDB_NORDAHEAD) {
+ /* Turn off readahead. It's harmful when the DB is larger than RAM. */
#ifdef MADV_RANDOM
- madvise(env->me_map, env->me_mapsize, MADV_RANDOM);
+ madvise(env->me_map, env->me_mapsize, MADV_RANDOM);
#else
#ifdef POSIX_MADV_RANDOM
- posix_madvise(env->me_map, env->me_mapsize, POSIX_MADV_RANDOM);
+ posix_madvise(env->me_map, env->me_mapsize, POSIX_MADV_RANDOM);
#endif /* POSIX_MADV_RANDOM */
#endif /* MADV_RANDOM */
+ }
#endif /* _WIN32 */
/* Can happen because the address argument to mmap() is just a