Very good post, and you're right! Back to the initial point then.
Except for some very basic stuff, I'm no programmer. But how hard do you think it is to implement a caching feature? I was checking the Bitcoin-qt process, and it looks like most of it's I/O activity was happening to the blkindex.dat file, which could quite easily fit in most people's RAM. Do you think it's feasible to cache that entire file into RAM? Of course, a smarter caching algorithm would be much better, but would also be quite a bit harder to implement. And we have to make sure sudden loss of power won't result in corrupted blockchains.
Btw, just for reference, I started writing
Armory about 9 months ago when the blockchain was a few hundred MB. I asked the same question, and even built an experimental, speed-optimized blockchain scanner that holds the entire blockchain in memory. It has been remarkably successful for those that have enough RAM, but it's going to become unusable
very soon. The blockchain has more than doubled in size since I started, and it's increasing in speed. I'm scrambling to get something in there so that systems with less than 4GB of RAM can use it...
Instead, I'm switching to an mmap-based solution which seems to give the best of both worlds. It's treating disk space like memory, and a memory access retrieves the data from disk if it's not in the cache. The nice thing about this is, if you have a system with 8GB+ RAM, it will just cache the whole blockchain and you get the benefits of the original implementation. But if you have less RAM, it will cache as much as it can, and supposedly intelligently. The caching is OS-dependent, but fairly optimized, as it's something that's actually implemented at the kernel layer. The only consideration there is that if you are going to some kind of structured access pattern of the file, then you can "advise" the mmap'd memory about it and it will optimize itself for it (i.e. - if you are going to access the whole file sequentially, it will start caching sector i+1 as soon as you read sector i).
The problem with "why not hold everything in RAM?" questions is that with Bitcoin, there is no limit on what "everything" will be. I don't know exactly what the blockindex holds, but there's no guarantee it won't get wildly out of hand -- maybe someone figures out how to spam the blockchain with certain types of bloat. Then, thousands of users who've been using the program for months, suddenly can't load the client anymore. Even with blockchain pruning, there's no guarantees.
So, my lessons from Armory were that you should never count on anything being held entirely in RAM. And I like gmaxwell's solution of having a SPV-node until synchronization completes, then switching. I've been pondering this a lot recently, but haven't come up with a good, robust (and user-understandable) way to implement it yet.