Python gdal和ThreadPoolExecutor——线程安全?

Python gdal和ThreadPoolExecutor——线程安全?,python,multithreading,gdal,threadpoolexecutor,Python,Multithreading,Gdal,Threadpoolexecutor,我刚刚发现了一个奇怪的问题,gdal和concurrent.futures.ThreadPoolExecutor不能很好地发挥作用。具体地说,即使最终的文件包含有效数据,我们最终的文件大小也会有巨大的变化 最简单的工作示例如下所示: import concurrent.futures 从pathlib导入路径 将numpy作为np导入 从osgeo导入gdal sz=256*8 n_波段=35 img=np.random.uniform(0.0256.0,size=(sz,sz,n_带)).as

我刚刚发现了一个奇怪的问题,
gdal
concurrent.futures.ThreadPoolExecutor
不能很好地发挥作用。具体地说,即使最终的文件包含有效数据,我们最终的文件大小也会有巨大的变化

最简单的工作示例如下所示:

import concurrent.futures
从pathlib导入路径
将numpy作为np导入
从osgeo导入gdal
sz=256*8
n_波段=35
img=np.random.uniform(0.0256.0,size=(sz,sz,n_带)).astype(np.uint8)
n_tifs=150
def制造商(i):
outfile=f'data/tmp/{i}.tif'
选项=[
'压缩=LZW',
“平铺=是”,
'预测值=2',
“复制\u SRC\u概述=是”,
]
dst_ds=gdal.GetDriverByName('GTiff').Create(outfile,sz,sz,n_bands,gdal.GDT_字节,options=options)
对于范围内的j(n_波段):
dst_ds.GetRasterBand(j+1).WriteArray(img[j])
dst_ds.FlushCache()
德尔德斯图兹酒店
将concurrent.futures.ThreadPoolExecutor(max_workers=n_tifs)作为e:
e、 地图(制作、范围(n))

sizes=[Path(f'data/tmp/{i}.tif').stat().st_size/(1据我所知,它的频带数..我尝试了多达20个,它与
ThreadPoolExecutor
的预期一致,但#频带25开始给我不同的结果。我想这与PREDICTOR=2和#频带有关。 需要一些gdal专家来解答这个问题。可能值得在gdal github IMO中提出。我在
gdal 2.4.2