Dynamic Memory Allocation Limit?
Pieter de Goeje
pieter at degoeje.nl
Wed Apr 30 02:45:05 UTC 2008
On Wednesday 30 April 2008, Edward Ruggeri wrote:
> I have recently been writing an implementation of the sieve of
> Eratosthenes in C. To find all primes less than N, I dynamically
> create an array of chars (relatively small datatype) of length N+1 (I
> know I don't need to represent evens).
When I wrote my version a long time ago, I made it possible to split the set
of possible prime numbers in blocks of managable sizes to avoid this
problem :) this ofcourse made the algorithm somewhat slower. (Also I stored
the state of 8 odd numbers in one byte, reducing memory usage significantly)
> Everything works great up until around 600 million, at which case
> memory allocation fails. At this point, I am asking for 600M chars,
> which is about 572MB (I might be failing to take account of offset?).
> My system has about 2GB of memory. Top says: Mem: 159M Active, 1113M
> Inact, 185M Wired, 56M Cache, 112M Buf, 481M Free.
> >From the man page, I am not completely clear what these values mean.
> However, I have read elsewhere that memory labeled as inactive should
> be available for the heap
Yes, it is.
> Is there a limit to how much memory may be allocated to a process?
> Any other reasons someone might think of?
Yes, there is the datasize limit. limits(1) will show you how much memory each
process can allocate. To increase "datasize", set the tunable kern.maxdsiz
(more info in tuning(7)).
I guess the system is running FreeBSD/i386, because I think the default limit
is about ~500MB on FreeBSD/i386. Note that it isn't possible to allow
processes to use more than ~3GB of memory on FreeBSD/i386 because of that
platform's constraints. More is possible on for example FreeBSD/amd64.
> I am using FreeBSD 6.3-prerelease, with SMP for a Athlon X2 4200+ (if
> it makes a difference). Sorry if this is a RTFM question ...
> -- Ned Ruggeri
Pieter de Goeje
More information about the freebsd-questions