I would store the map in ServerStorage if it is big, if the player needs data like a image of the map,
map name, etc I would send it to the client with a remote or have the map image and name display on a surface gui on the server.
To load a map I would simply using a ipairs loop, cycle through all models (if the map is split in seperate models) and clone each model one by one with a 1/4 second delay between each clone to the workspace (or where you want the map).
Kinda like this.
local maps = game.ServerStorage.Maps:GetChildren() -- Collect all existing maps.
local chosenmap = maps[math.random(1, #maps)] -- Pick random map from table.
print("Loading the map...")
for k, v in chosenmap:GetChildren() do -- ipairs() is not needed.
v:Clone().Parent = workspace.CurrentMap
--A small delay so that client and server can catch up and reduce lag.
task.wait(0.25)
end
print("Map loaded.")
To unload the map simply do
workspace.Currentmap:ClearAllChildren()
That’s my way of doing it.
Hope that helps.
Edit:
Since this still gets referenced and linked years later, I improved the formatting a little and use more modern Lua code.