Оптимального размера нет. В случае 32-разрядного процесса всего 4 ГБ адресного пространства, и обычно для процессов пользовательского режима доступно только 2 ГБ. Затем эти 2 ГБ фрагментируются кодом и данными из exe и DLL, распределением кучи, стеками потоков и так далее. Учитывая это, вы, вероятно, не найдете более 1 ГБ непрерывного пространства для сопоставления файла в памяти.
Оптимальное число зависит от вашего приложения, но я бы хотел отобразить более 512 МБ в 32-битный процесс. Даже если вы ограничите себя 512 МБ, вы можете столкнуться с некоторыми проблемами в зависимости от приложения. В качестве альтернативы, если вы можете использовать 64-разрядную версию, проблем с отображением нескольких гигабайт файла в память не должно быть - адресное пространство настолько велико, что не должно вызывать проблем.
Вы можете использовать такой API, как VirtualQuery, чтобы найти наибольшее непрерывное пространство, но тогда вы фактически выталкиваете ошибки памяти, возникающие при удалении большого количества адресного пространства.
РЕДАКТИРОВАТЬ: Я только что понял, что мой ответ зависит от Windows, но вы не знали, какую платформу вы обсуждаете. Я предполагаю, что другие платформы имеют аналогичные ограничивающие факторы для отображаемых в памяти файлов.