Image from www.shutterstock.com |
So if you have an 8 bits address register, then you can address up to 2^8=256 elements, for 32 bits you can address up to 2^32=4G elements and for a 64 bits you can have up to 2^64=16 E (Exa) elements. It means that a typical 64 bit processor can address up to 16E Bytes of memory in theory, although they don't do it (I think most of them are using 48 bits at the moment).
Note that computers can address Words instead of Bytes, in facts the size of the memory elements in bit which is called word size can be 8, 16, 32, ... So in this case, the total memory capacity will be the number of addressable elements times size of the memory's word.
To read from or write into a memory element you need to have an address register capable of keeping the size of the address space, so for our 64 bit processor, we need a 64 bit address register to be able to address each of the memory element in random. We also need a word register which lets us read data addressed by address register or write it in the addressed place. The following pseudo codes are for what we talked about:
// AR is Address Register
// WR is Word Register
// R1 is just a register
Move WR,(data to be stored)
Move AR,(address to be put word data in it)
Write
// sample read from a random memory place
Move AR, (address to be put word data in it)
Read
Move WR, R1
Or if you store your data in a database table with an incremental primary key then all you need is just execute something like the following queries:
// a sample read
select <element> from <table>
where <primary_key> = "element_address"
// a sample write
update <table> set <element> = "element_data"
where <primary_key> = "element_address"
Or if we want to implement it as an array, in Java we can have it like:
myRAM = new int[2048]; // 2048 is the size of address space
myRAM = new int[2048]; // 2048 is the size of address space
myRAM[102] = -200; // write to a random address;
int i = myRAM[102]; // read from a random address;
Move R1, 334 // usually, at least, one operand must be a register
CMP R1, 224 // the second can be a register or number or memory
IEQ EqualLabel // after comparison you need to test a compare flag
If the content of the memory element is something like string or even records or anything larger than the processor's word size, then the compare gets complicated and needs some loops over all record detail and perhaps another loop for each field of the record.
Now consider you want to find a match in RAM with size of 10^300 bytes!? This was the storage size of a 1000 bit Spars Distributed Memory gives us. You can't just start comparing from the beginning address of the RAM or divide RAM into some smaller part and do some parallel search for the memory element you are looking for! (you can but it doesn't give you the result you are looking for) Sorting also doesn't give you a good result, you may need to compare log2(10^300) ~ 1000 times for each memory element, it is still too much time consumer.
Why am I talking about these basic things? Because the methods we are using to store and retrieve dense data aren't useful for huge amount of memory, this is what we see in relational databases, or even in many modern big data storage and retrieval technologies, but how we human do this in our mind!?
It seems that mother nature has already had a plan for this problem and has known how to deal with the storage and searching in huge amount of memory we human keep during our life.