I would use heightmaps. You can edit them with an image editor, or easily in your own editor by manipulating the image data directly. I would suggest you to use 16bit image data because you will have smoother surfaces. You can also generate lightmaps with these heightmap. You dont have to load the whole image at once, you could split it into chunks and then load them individually.