views:

126

answers:

2

I'm trying to create an array of bytes whose length is UInt32.MaxValue. This array is essentially a small(ish) in-memory database:

byte[] countryCodes = new byte[UInt32.MaxValue];

On my machine, however, at run-time, I get a System.OverflowException with "Arithmetic operation resulted in an overflow".

What's the deal? Do I need to use an unsafe block and malloc? How would I do that in C#?

+9  A: 

The current implementation of System.Array uses Int32 for all its internal counters etc, so the theoretical maximum number of elements is Int32.MaxValue.

There's also a 2GB max-size-per-object limit imposed by the Microsoft CLR.

A good discussion and workaround here...

And a few related, not-quite-duplicate, questions and answers here...

LukeH
+1  A: 

I wouldn't do this in the first place. Why would you want to set all that memory aside for this in-memory database? Wouldn't you rather want either a data structure which size increments as you go along (e.g. List<int>)? Or (if preferred) use an in-memory database like sqlite?

steinar