That is only 1172 variables needed NOT 1.8 million!
It sounds like you are being very inneficient with how you are storing your data.
If you wanted to be even more efficient with how you store data you could drastically cut down on that number even further. If you stored only the achievements and items that the player DID have, say that each player typically has half the items and achievements available then that is only about 500 variables needed for the average player.
If you combined all those boolean states for whether a player has an item or achievement into a string you could probably reduce it so that each player only needed 7 variables.
From what you describe I don't see why you need more than 7 variables so I don't know how you manage to have 1.8 million lol.
That is NOT 1.8 million integers being saved!
amount of Exp = 1 integer variable
credits = 1 integer variable
play count = 1 integer variable
win count = 1 integer variable
amount of heroes = 28
play count for each hero = 1 integer variable
items gained = 840 boolean variables
achievements earned = 300 boolean variables
ACTUALLY the maths is
1 + 1 + 1 + 1 + 28*1 + 840 + 300 = 1172
That is only 1172 variables needed NOT 1.8 million!
It sounds like you are being very inneficient with how you are storing your data.
If you wanted to be even more efficient with how you store data you could drastically cut down on that number even further. If you stored only the achievements and items that the player DID have, say that each player typically has half the items and achievements available then that is only about 500 variables needed for the average player.
If you combined all those boolean states for whether a player has an item or achievement into a string you could probably reduce it so that each player only needed 7 variables.
From what you describe I don't see why you need more than 7 variables so I don't know how you manage to have 1.8 million lol.