This is easily solved by just using large pages. On x86-64 that is 2 MB per one 8 byte entry which is ~1/256k overhead instead of 1/512.
On a contiguous shared data area on the order of 1 GB, you are only tolerating a 2 MB overallocation on 1 GB of data area (~1/512 overhead), but saving ~2 MB of PTEs per process sharing the data (including the first) so you can come out ahead even if you are sharing at all.
At 300 GB you can even reasonably use 1 GB pages for a even more ridiculous ~1/128M overhead and effectively never run into the problem.