The world in minecraft is not simply a big 3D array of all
blocks.
The game uses a procedural generator to create the
surface on the fly.
This way you can create an infinitively big world, without
using up much memory.

Only the part wich was altered by the player in any way
has to be stored. (the delta / the difference)

So step 1: generate the terrain given the procedural formula
for the current region
step 2: alter the world by the stored changes (the actual 3D array that has to be saved)

Only do that for the visible regions.
When leaving the region, update the new regions,
and trash the non visible regions.

------

To increase the framerate:

You can esily create a visibility list:

To determine if a block needs to be rendered, you can use
a simple method:

For each block in the "chunk" section:

Look if the block has a solid block on EACH of
its 6 sides.
if yes, mark the block invisible.
It cant be seen from anywhere.

Glass/Water/empty blocks are not treated as solid blocks.
(You can even test this in minecraft when setting
the grass texture transparent)