Actually, we can scratch most of this. I'd still be interested to know why the bank memory isn't returned in GCMemAlloced(), but the rest is no longer an issue.
I spent the evening working out how much more memory I'd need to store everything in whole bytes, as per normal. It came out at 55.5MB. The vast majority (51.5MB) of that comes from a single table, which holds details of all the people in the game and was the reason I was using such a system in the first place - their attributes are over deliberately small ranges to fit more in memory. I'd assumed that it would be a good idea to extend the theory over the entire database, but it doesn't make sense to do so any more.
I can still store the person attributes in an encoded form within a standard database, so I'll be doing that.
I spent the evening working out how much more memory I'd need to store everything in whole bytes, as per normal. It came out at 55.5MB. The vast majority (51.5MB) of that comes from a single table, which holds details of all the people in the game and was the reason I was using such a system in the first place - their attributes are over deliberately small ranges to fit more in memory. I'd assumed that it would be a good idea to extend the theory over the entire database, but it doesn't make sense to do so any more.
I can still store the person attributes in an encoded form within a standard database, so I'll be doing that.