It may be possible in blueprints, though, I haven’t tried this kind of saving in either C++ or blueprints. is right in the sense that you have to at least save every movable actors location and a reference to what that actor is (house, player, grass block etc.). The best way to approach that is creating an array for all the movable actors, and an array for all their locations. That means you need to get references of all those actors either when they are created or using GetAllActorsOfClass.
Looking at how minecraft does it. Minecraft worlds are separted into chunks: 16 blocks wide, 16 blocks long, and 256 blocks high, which is 65,536 blocks total. Each block has a location value in that chunk and a description value that describes what kind of block it is. i.e. 1:1:1:1:1 may correspond to block at location Chunk 1, x coordinate 1, y coordinate 1, z coordinate 1, and block type Bedrock. 50:25:25:25:3 may, similarly, correspond to a block in chunk 50, x coordinate 25, y coordinate 25, z coordinate 25, and block type Redstone.
Chunks are created, loaded, saved, and unloaded depending on where the player currently is in the world. Not sure the exact render distance, but there is a built-in limit on how many Chunks away are loaded/created and how many you can see.
I would mess around with saving+loading arrays of actors and their locations.