One way this is done is through the use of memory caches. Caches are fast memory which is split into cache lines. These lines contain data from different part of the memory that is being used often. Thus, if a few pieces of data are being used throughout an application, they are stored in a cache, where they can be retrieved more quickly than if all of the memory had to be searched.
A method that increases the maximum size for a program is virtual memory. Virtual memory is when a program starts its memory address space at 0 and goes up, but the actual location is translated into a different physical address. This allows a degree of flexibility, for each process believes it has all memory to itself. Virtual memory also splits the program's memory into chunks called pages. By being separated into pages, programs are easier to fit together in memory, or move out to disk in portions.
Yet another method of speeding up memory is improving bandwidth. Bandwidth is the amount of information that is being sent at one time. Sending more information at one time saves a huge amount of access time. Some ways of doing this are increasing cache size and splitting up memory addresses in memory such that the call of one does not stall the call of another. In the future, improvements will hopefully made so that several memory references will be made per clock cycle.