Associative Arrays max length? 32bit/64bit
FG via Digitalmars-d
digitalmars-d at puremagic.com
Sat May 17 12:31:35 PDT 2014
On 2014-05-17 12:46, sdvcn wrote:
> int main(string[] argv)
> {
> auto flog = File("results.txt", "w");
>
> size_t[string] bary;
>
> for(size_t i=0;i<(size_t.max -1);i++)
> {
> bary["Key:" ~ to!(string)(i)] = i;
> flog.write("stop i=" ~text(i));
> flog.seek(0);
> flog.flush();
> }
> return 0;
> }
>
> results:
> start i=0
> stop i=36495998
> ---------------
> start i=0
> stop i=36495992
> ----------------
> start i=36495998
> stop i=72991099
>
> I guess not see why Overflow.
This code will always make you run out of memory. Why are you surprised?
Each key in the hash table is a string in the form "Key: 1234", so at stop (i = 36495998) the string has 13 bytes. Add to that 16 bytes for slice of that string (assuming 64-bit architecture), 8 bytes for the value, some space wasted on alignment, and don't forget the extra memory needed to store the tree for fast key look-up in the hash array.
You said that you have 16 GB of memory. At i = 36495998 that means at most 470 bytes per item.
As for capturing the problem, you can catch the Out-of-memory error but you cannot do that by catch(Exception e). OutOfMemory is not an Exception. It is an Error. Here is the updated example:
import std.stdio, std.string, std.conv, core.exception;
int main(string[] argv) {
size_t[string] bary;
size_t i = 0;
try {
for (; i < (size_t.max - 1); i++)
bary["Key:" ~ to!(string)(i)] = i;
} catch (OutOfMemoryError e) {
writeln(e);
}
writefln("Last index was: %d", i);
return 0;
}
More information about the Digitalmars-d
mailing list