Few ways come to mind. All solutions consist primarily of array or list of undo operations. But what each operation is, may differ:
1) Compress the map using TCompressionStream and TDecompressionStream. Your data size per undo-operation might go down to some number measured in kilobytes.

2) Just save the action what was done, not whole map (unless necessary). You can make base-class TUndoAction, and inherit from it like:
Code:
// Some action where you select rectangular area, and move it in some direction...
TMoveUndoAction = class(TUndoAction)
public
  selEnd, selSize, moveDelta: TVector3f;
  procedure Execute; override;
end;

// Free tile-painting for map. You might need to save the entire map for this, so you can use the TCompressionStream
// to write in TMemoryStream.
TPaintUndoAction = class(TUndoAction)
public
  map: TMemoryStream;
  procedure Execute; override;
end;
You get the idea, there can be lots of kinds of undo operations, some of which may not be related to tiles at all. And i'm not sure what all your editor can do.