4. 批处理与自动化 (Batch Processing & Automation)
来源说明 本文翻译自 Spatial Thoughts,原作者为 Ujaval Gandhi。
**原文链接:** https://courses.spatialthoughts.com/gdal-tools.html
**本文仅供学习交流,版权归原作者所有。**
4.1 批量运行命令 (Running commands in batch)
你可以使用 Python 循环运行 GDAL/OGR 命令。例如,如果我们想将目录中所有文件的图像格式从 JPEG2000 转换为 GeoTiff,我们需要对每个图像运行类似下面的命令。这里我们希望 {input} 和 {output} 值由目录中的文件确定。
gdal_translate -of GTiff -co COMPRESS=JPEG {input} {output}
如果你想对数百个输入文件运行命令,手动操作将非常费力。这时,一个简单的 Python 脚本可以帮助你自动批量运行命令。数据目录包含一个名为 batch.py 的文件,其中包含以下 Python 代码。
import os
input_dir = 'naip'
command_string = 'gdal_translate -of GTiff -co COMPRESS=JPEG {input} {output}'
for file in os.listdir(input_dir):
if file.endswith('.jp2'):
input = os.path.join(input_dir, file)
filename = os.path.splitext(os.path.basename(file))[0]
output = os.path.join(input_dir, filename + '.tif')
command = command_string.format(input=input, output=output)
print('Running ->', command)
os.system(command)
在 Anaconda Prompt 中,从 gdal-tools 目录运行以下命令,开始对 naip/ 目录中包含的所有图块进行批处理。
python batch.py
数据目录还包含一个使用 Python 内置多处理库并行运行批处理命令的示例。如果你的系统有多核 CPU,像这样在多个线程上并行运行命令可以比串行运行提供性能提升。
import os
from multiprocessing import Pool
input_dir = 'naip'
command_string = 'gdal_translate -of GTiff -co COMPRESS=JPEG {input} {output}'
num_cores = 4
def process(file):
input = os.path.join(input_dir, file)
filename = os.path.splitext(os.path.basename(file))[0]
output = os.path.join(input_dir, filename + '.tif')
command = command_string.format(input=input, output=output)
print('Running ->', command)
os.system(command)
files = [file for file in os.listdir(input_dir) if file.endswith('.jp2')]
if __name__ == '__main__':
p = Pool(num_cores)
p.map(process, files)
该脚本以并行和串行模式运行命令,并打印每种模式所花费的时间。
python batch_parallel.py
4.2 自动化和调度 GDAL/OGR 任务 (Automating and Scheduling GDAL/OGR Jobs)
在基于 Linux 的服务器上按计划运行命令的最简单方法是使用 Cron Job。
你必须编辑你的 crontab 并安排脚本(Shell 脚本或 Python 脚本)的执行。关键是在执行脚本之前激活 conda 环境。
假设你创建了一个脚本来执行一些 GDAL/OGR 命令,并将其放置在 /usr/local/bin/batch.py,这是一个每天早上 6 点执行它的示例 crontab 条目。
0 6 * * * conda activate gdal;python /use/local/bin/batch.py; conda deactivate
如果在执行时出错,你可能需要在 crontab 文件中包含一些环境变量,以便它能正确找到 conda。了解更多。
SHELL=/bin/bash
BASH_ENV=~/.bashrc
0 6 * * * conda activate gdal;python batch-parallel.py; conda deactivate
4.3 提高性能的技巧 (Tips for Improving Performance)
配置选项 (Configuration Options)
GDAL 有几个 配置选项,可以通过调整这些选项来帮助加快处理速度。
--config GDAL_CACHEMAX 512: 这个选项通过允许 GDAL 命令使用更多 RAM (512 MB) 读取/写入数据,有助于加速大多数 GDAL 命令。--config GDAL_NUM_THREADS ALL_CPUS: 这个选项通过使用多个线程进行压缩来帮助加快写入速度。--debug on: 打开调试模式。这会打印可能帮助你找到性能瓶颈的额外信息。
多线程 (Multithreading)
gdalwarp 实用程序支持多线程处理。并行处理有 2 个不同的选项。
-multi: 此选项并行化 I/O 和 CPU 操作。-wo NUM_THREADS=ALL_CPUS: 此选项在多个核心上并行化 CPU 操作。
还有一个选项允许 gdalwarp 使用更多 RAM 进行缓存。此选项对于加速大型栅格上的操作非常有帮助。
-wm: 设置更高的缓存内存。
所有这些选项都可以组合使用,这可能会导致更快的数据处理。
gdalwarp -cutline aoi.shp -crop_to_cutline naip.vrt aoi.tif -co COMPRESS=DEFLATE -co TILED=YES -multi -wo NUM_THREADS=ALL_CPUS -wm 512 --config GDAL_CACHEMAX 512