madvise + mincore syscalls could be used to get the kernel to preload the pages asynchronously.
Polling mincore wouldn't be that bad as it would only happen between the commands and at least the core of the algorithm would be simple: before executing a command, check if it's data are in memory with mincore, if not ask to load them with madvise, and go to the next command.
What does Flash use worker threads for?
http://www.usenix.org/event/usenix99/full_papers/pai/pai_htm...
While ram is far cheaper than it once was, there still are substantial savings in reducing your resident set requirements from TBs to just hundreds of GBs.
The idea is to process in parallel everything you can and have the services ("processors") communicate asynchronously by events.