Hi @italosena,
I think, keeping your data in the point cloud form is only way to move forward - transforming point clouds to anything else will make the whole process even heavier - significantly heavier.
How do you currently detect changes?
I made some experiments with Minecraft change detection a few years ago, and I can say that some combination of PointCloudFilter, PointCloudMerger, and PointCloudExpressionEvaluator worked quite well. For example, with PointCloudFilter, you can reduce the size of the source point cloud to the extents that you need for comparison - write a condition for min and max for x, y, and z (or use Clipper instead), and then in PointCloudMerger, merge by x, y, z, and blockID (and blockData if necessary), and whatever does not get a match (NotMerged port) is your change - the output from this port will be much-much smaller than the source point cloud and can be handled easily.
Another trick you can use is to take only a few blocks from the surface (or the top block, whatever it is) down - say, 20 blocks (or as deep or high as your changes go), so that you don't need to use all blocks down to 0. This is a pretty neat trick I think. Sort your point cloud by xy ascending, and by z - descending. Then, using index() function in PointCloudExpressionEvaluator, assign a unique number to each point (name it, for example, pointID). Then merge the point cloud to itself by x and y (PointCloudMerger), and rename pointID to columnID in the point cloud that comes out from the Referenced port. Then merge again by xy, and after that, each point knows, to which columns it belongs. Then, PointCloudFilter with (@Component(pointID)-@Component(columnID))<=20 will give you the top 20 blocks for each column. After that - see above.
I hope this helps. Let me know if you need more help.
Dmitri