https://gis.stackexchange.com/questions/146855/gdal-array-savearray-leaves-dataset-open-in-python
Saving and closing datasets/datasources
To save and close GDAL raster datasets or OGR vector datasources, the object needs to be dereferenced, such as setting it to None, a different value, or deleting the object. If there are more than one copies of the dataset or datasource object, then each copy needs to be dereferenced.
For example, creating and saving a raster dataset:
>>> from osgeo import gdal
>>> driver = gdal.GetDriverByName('GTiff')
>>> dst_ds = driver.Create('new.tif', 10, 15)
>>> band = dst_ds.GetRasterBand(1)
>>> arr = band.ReadAsArray() # raster values are all zero
>>> arr[2, 4:] = 50 # modify some data
>>> band.WriteArray(arr) # raster file still unmodified
>>> band = None # dereference band to avoid gotcha described previously
>>> dst_ds = None # save, close
The last dereference to the raster dataset writes the data modifications and closes the raster file. WriteArray(arr) does not write the array to disk, unless the GDAL block cache is full (typically 40 MB).
With some drivers, raster datasets can be intermittently saved without closing using FlushCache(). Similarly, vector datasets can be saved using SyncToDisk(). However, neither of these methods guarantee that the data are written to disk, so the preferred method is to deallocate as shown above.