arrays, mmu, addressing choices

LaTeigne via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 9 08:29:43 PDT 2016


On Monday, 8 August 2016 at 21:45:06 UTC, Charles Hixson wrote:
> I have a rather large array that I intend to build. but much of 
> it will only occasionally be used.  Will the unused sections 
> automatically be paged out?  If it matters my system is Debian 
> Linux.
>
> This array will be indexed by a ulong.  Is there any reasonable 
> maximum size?  I've considered segmented addressing anyway, in 
> case that's needed to allow paging, and it will definitely be 
> needed when I get around to concurrent processing, with 
> different sections resident in different threads.  But if 
> appropriate I could do that from the start.
>
> The questions above are really for a normal array, but I'd also 
> be interested in how using an associative array would affect 
> them.
>
> I expect to eventually be using more memory than I have RAM in 
> my system, so designing for paging is going to be important.  
> (Before then I'll be adding more RAM and a larger disk drive, 
> but if I complete the full design even a large disk is going to 
> be small.)

- maximum size relies on the memory fragmentation. With a system 
with 8Gb DRAM you might be able to allocate a 6Gb array just 
after boot, but after 1 week up time only 4Gb.

- sectors won't be automatically swapped. After reading your Q I 
was thinking to mmap() (in D: MMapAllocator + makeArray) but what 
actually happens is that nothing is allocated until it's used 
(allocation on comitment). Once it's there: it's there. Also mmap 
doesn't allow to allocate more than what's physically available.

- If you want a really big array you could design your own 
container with an array interface. The whole thing would reside 
on the HDD but a sector would be dynamically/lazily cached to 
DRAM on access, and a sector cache freed either explictly or 
according to several rules such as max usage, thread out of 
scope, these kind of stuff.

- your Q also makes me think to this data structure: 
https://en.wikipedia.org/wiki/Unrolled_linked_list. But I know 
nothing about it (seen a Delphi implementation years ago, that's 
all). The idea would be to create a custom allocator for the 
nodes (each linked sector) with disk "swap-ability".




More information about the Digitalmars-d-learn mailing list