Ok, if you MUST send 5mb, the very, very best thing you can do is:
Use data compression like gzip or gzcompress to reduce the 5mg payload. Typically a file can be reduced to about 20-25% of original size (down to 1-1.25mb in your case).
That said, you really should look at restructuring what data you require to power your game, because 5mb is way more than typical!
You’re not giving us any specifics to work with, so here’s a “straw dog” for us to play with: Assume your game is chess. (I know it’s not, but we need something to center our focus on)
Move all rendering to the client. The data you send should only send the move (“Rook-A6”). The client takes that data and renders the Rook graphically moving from its current position to the new position on A6.
Move game logic to the client. The client should be able to independently react to game conditions. For example, the client should “undo” a move which the player tries to put his king in jeopardy. Similarly, if you send data for a complicated move like (“castle king-side”), the client should know how to move the king+rook appropriately without requiring explanation from your data.
Do some pattern recognition to simplify/reduce data being sent. So to set the initial position of all 32 pieces on the chess board, you send (“Reset”) instead of (“move white Rook-A1, move white Knight-B1…and so on”).
Use semaphores to control the availability of game resources. If part of your game is requiring users to acquire/use a common group of scarce resources, use semaphores to let the users “check-out”/”check-in” resources instead of actually tracking the individual resources.