我正在使用简单的arcpy ListRasters
函数,而且脚本的执行速度很慢。
我正在使用包含大约100个栅格的文件夹(5个不同类别的20年历史数据)。每个光栅大约800Mo,总共80Go。我正在使用通配符将它们列在5个不同的列表中:
import arcpy, os, sys
from arcpy import env
from arcpy import *
from arcpy.sa import *
arcpy.CheckOutExtension("Spatial")
hist_data_path = "D:/Data/GIS/hist_data"
arcpy.env.workspace = hist_data_path
hist_pop_urban = arcpy.ListRasters("*pop_urb*")
hist_pop_rural = arcpy.ListRasters("*pop_rur*")
hist_ppc_urban = arcpy.ListRasters("*ppc_urb*")
hist_ppc_rural = arcpy.ListRasters("*ppc_rur*")
hist_ww_int = arcpy.ListRasters("*ww_int*")
[...]
列出20个栅格的每个集团需要大约10分钟...所以~50分钟列出所有栅格......这怎么可能?我会错过代码中的某些内容吗?是因为栅格的大小?是否有一些“隐藏”选项或“技巧”我可以检查?我在配备16Go RAM的i7计算机上使用Win 7 64。
感谢任何可以缩短处理时间的想法..!
答案 0 :(得分:1)
根据我的经验,arcpy通常很慢,所以尽量避免使用它。当然,可能有一些方法可以优化arcpy.ListRasters功能,如果有人知道的话,我很乐意听到它。
这是一个开箱即用的Python替代arcpy.ListRasters:
import os
directory = r"D:\Data\GIS\hist_data"
extension_list = [".tif", ".tiff"]
hist_pop_urban = []
hist_pop_rural = []
#etc.
for file in os.listdir(directory):
for extension in extension_list:
if file.endswith(extension):
if "pop_urb" in file:
hist_pop_urban.append(file)
elif "pop_rur" in file:
hist_pop_rural.append(file)
#etc.

您可以根据此网页的内容以及您对所处理的特定文件类型的了解来构建extension_list:
http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//009t0000000q000000
根据栅格的格式,每个栅格可能包含多个文件。如果是这样,您也必须将其合并到代码中。
祝你好运!汤姆
答案 1 :(得分:1)
我更喜欢使用glob
来列出栅格等数据。与arcpy.ListRasters()
方法相比,您可以非常快速地找到该操作。我修改了您的示例以使用glob
- 这里我假设您使用的是tif格式的栅格数据(如果需要,可以更改)。
import glob
inws = r'C:\path\to\your\workspace'
hist_pop_urban = glob.glob(os.path.join(inws, "*pop_urb*.tif"))
hist_pop_rural = glob.glob(os.path.join(inws, "*pop_rur*.tif"))
hist_ppc_urban = glob.glob(os.path.join(inws, "*ppc_urb*.tif"))
hist_ppc_rural = glob.glob(os.path.join(inws, "*ppc_rur*.tif"))
hist_ww_int = glob.glob(os.path.join(inws, "*ww_int*.tif"))