管理共享模型中的中间数据
运行模型工具时会创建和删除中间数据。在大多数情况下,您不必关注中间数据,对于共享模型中的中间数据也是如此。但在某些情况下,模型工具无法创建中间数据:模型失败,并且您(或者您的用户)所接收到的错误消息可能不会直接指出此问题。例如,消息可能会提示“异常错误”,而实际上工具只是由于不存在文件夹或地理数据库而无法写入工具的输出。
如果不考虑中间数据的位置,则您还可能遇到性能问题。应避免将您的中间数据发送至远程计算机或 ArcSDE 地理数据库。与远程文件系统或远程数据库进行跨网络通信的开销往往非常大,可能会导致模型性能明显下降。
用来确保模型能够创建和删除中间数据的最简单技术如下:
- 将所有中间数据变量设置为托管数据。
- 将临时工作空间环境设置为现有文件地理数据库。
步骤如下:
- 在目录 窗口中,右键单击模型工具,然后单击编辑。将打开模型构建器。
- 在模型构建器中,右键单击所有中间数据变量,然后选择托管。在托管旁边会出现一个复选标记 。
- 保存并关闭模型。
- 从地理处理菜单中选择环境,然后单击工作空间。
- 对于临时空间设置,指定一个新的文件地理数据库或使其指向默认地理数据库。
- 单击确定。
- 执行您的模型,方法是双击目录 窗口中的模型工具,输入参数,然后单击确定。如果仍存在错误,请仔细检查是否已将所有中间数据变量设置为托管数据,以及临时工作空间的设置是否正确。如果仍有问题,则可能存在以下一种情况:
- 问题不在于中间数据。
- 临时工作空间环境正在被模型重置。检查模型环境设置:
- 在目录 窗口中,右键单击您的模型工具,然后单击属性。
- 在属性对话框中,单击环境选项卡。
- 如果已选中工作空间旁边的复选框,则单击加号。
- 单击临时工作空间将其高亮显示,,然后单击值按钮。
- 如果“临时工作空间”设置中包含某个工作空间的路径,则请检查该工作空间是否存在。(可通过单击“浏览” 并浏览至工作空间的位置进行检查)如果该工作空间不存在,则输入现有工作空间的路径。
模型如何管理中间数据
您需要确保共享的模型中存在用于创建和删除中间数据的位置。最简单的方法是如上述步骤所述,将所有中间数据设置为托管数据。
本主题的其余部分深入介绍了地理处理管理中间数据的方式,从而为您排除故障提供了参考信息。以下部分将描述
- 如何自动生成输出路径
- 模型构建器如何了解用户是否已更改某个数据变量
- 如何针对中间数据使用托管选项
- 如何对输出路径进行变量替换
- ArcGIS Server 如何覆盖临时工作空间环境
- 如何设置 ToolShare 文件夹结构以便于管理中间数据
- 如何将临时数据写入 in_memory 工作空间
- 如何在脚本中使用临时工作空间环境
如何自动生成输出路径
在打开某个工具并提供输入数据集时,会自动生成输出数据的位置。如果设置了临时工作空间,则将使用临时工作空间的位置构建这个自动生成的名称,如果未设置临时工作空间,则使用当前工作空间的位置。无论输出数据变量最后是成为中间数据、托管数据还是工具参数,输出数据变量中都将包含自动生成的名称。
在分发模型时,接收者的临时工作空间或当前工作空间设置肯定不同,而他们希望应用自己的环境设置。也就是说,当他们打开并运行您的模型的工具对话框时,他们希望将所有中间数据写入其环境中所设置的临时工作空间。如果不更改数据变量中自动生成的名称,就会出现此种情况。下面将介绍如何更改数据变量。
数据变量的已更改状态
如果在模型构建器中修改某个变量的值,该变量值即被视为已更改。更改变量后,ArcGIS 会理解为您希望使用更改后的值且不再进行任何修改,并依照此原则进行操作。如果更改后的变量所包含的文件夹或工作空间路径在其他用户计算机中不存在,则模型将失败。
如果变量是一个输出数据集且其值为空或尚未更改,则地理处理工具将自动生成一个路径。您可以利用这一点,即不更改输出数据集参数,以便地理处理为您自动生成一个路径。
在模型构建器中,无法确定数据变量是否被视为已更改,但您可以重置变量的已更改状态,方法是删除(取消)现有值,然后验证整个模型。验证过程将发现输出值为空,即会为中间数据自动生成一个新名称,然后将此数据变量标记为未更改。然而,更好的方法是将变量设置为“托管”,如下所述。
使用托管数据
您可以选择使用模型管理器管理中间数据的位置(使用描述的逻辑)。通过右键单击变量,然后单击托管选项,您可以将数据变量设置为托管数据。将某一变量设置为托管数据后,您将无法在模型构建器中更改输出路径(参数控件将始终不可用)。这表示托管数据不能改变自己的已更改状态,并且在每次执行模型时,都将自动为数据生成一个新路径。
使用 %scratchworkspace%
自定义脚本工具可能会提供一个自动生成的输出路径。如果未提供自动生成的输出路径,则可在模型构建器中对输出路径的变量进行替换,如下所示。
使用变量替换的主要问题在于,您难以判断在执行工具时 %scratchworkspace% 是系统文件夹还是地理数据库。当在模型构建器中构建模型时,如果您的临时工作空间是一个 shapefile 工作空间(文件夹),则模型构建器会自动在要素数据集名称后边附加 .shp(也就是说,您输入 %scratchworkspace%/temp 后,模型构建器会自动将其替换为 %scratchworkspace%/temp.shp)。如果您之后将临时工作空间更改为文件地理数据库,并使用模型工具的对话框运行模型工具,则模型将失败,因为模型会试图将 temp.shp 写入文件地理数据库,而地理数据库中不能包含特殊字符,如 .shp 中的点。
只有在以下两种情况下,您能够准确无误地预测出临时工作空间的类型:
- 当在 ArcGIS Server 上运行工具时
- 使用推荐的 ToolShare 文件夹结构包含临时文件夹时
下文详细分析了这两种情况。
ArcGIS Server 临时工作空间
当在服务器上执行服务器工具时,ArcGIS Server 会为要使用的工具创建一个唯一作业文件夹。此作业文件夹中包含一个名为 scratch 的文件夹,而在这个文件夹内,有一个名为 scratch.gdb 的文件地理数据库,如下所示。
ArcGIS Server 将应用程序级别的临时工作空间环境设置为该唯一临时文件夹的位置。它将忽略工具、模型或者模型过程级别的临时工作空间设置。当运行服务器工具时,任何中间数据或托管的输出数据变量的位置都将被重置为使用作业文件夹的临时工作空间,除非数据变量不属于托管形式或者已被更改。
由于 ArcGIS Server 始终会创建该临时文件夹(该文件夹中包含一个临时地理数据库),并始终将临时工作空间环境设置为该临时文件夹,因此您可以放心地对所有输出路径进行变量替换。例如:
%scratchworkspace%/output_buffer.shp %scratchworkspace%/scratch.gdb/outBuffer
使用共享文件夹结构
共享工具的结构中对建议使用的一种文件夹结构 - ToolShare 进行了介绍,如下所示。
ToolShare 文件夹结构适用于共享工具,无论是在 LAN 上共享工具还是将工具发布至 ArcGIS Server。
请注意,与 ArcGIS Server 创建的唯一作业文件夹类似,ToolShare 文件夹中包含了一个 scratch 文件夹和一个 scratch.gdb。您可以对模型进行相应设置,以便始终将模型的中间数据写入此临时文件夹,步骤如下:
- 将模型环境临时工作空间设置为共享文件夹中的临时文件夹。
- 将工具箱设置为使用相对路径。
- 在模型中,针对任一中间数据进行变量替换。
%scratchworkspace%/output_buffer.shp %scratchworkspace%/scratch.gdb/outBuffer
在模型参数中使用 %scratchworkspace% 将会采用应用程序级别而非模型级别的临时工作空间,因此您只需对非参数数据变量(如中间数据)使用该技术。
如果在跨 LAN 共享工具箱时使用此技术,则每次执行工具都会将中间数据写入此临时文件夹。以下是示例配置:
- \\pondermatic 上的用户向您的共享文件夹 \\cogitator\GPTools 中添加一个文件夹连接。
- 该用户打开并执行 RetailFunctions 工具箱中的某个工具。
- 由于您使用相对路径存储 RetailFunctions 工具箱,因此临时工作空间的位置 %scratchworkspace% 将扩展为 \\cogitator\GPTools\scratch,并且所有中间数据都被写入 \\cogitator\GPTools\Scratch。
是否在跨 LAN 共享时使用此技术由您决定。第一个注意事项即是否授予其他用户向您的共享文件夹写入数据的权限。其次,跨 LAN 写入数据通常要比向本地磁盘写入数据慢很多。使用工具用户设置的临时工作空间环境比较可取。但如上文所述,您无法了解用户是将其临时工作空间设置为文件夹还是地理数据库。使用此技术,您可以知道临时工作空间的类型。
将临时数据写入 in_memory 工作空间
地理处理提供了一个 in-memory 工作空间,您可以将要素和表写入此工作空间。
- 注:
只可以将表和要素类(点、线和面)写入 in_memory 工作空间。in_memory 工作空间不支持扩展的地理数据库元素,如子类型、属性域、制图表达、拓扑、几何网络以及网络数据集。只能写入简单的要素和表。
请勿将您的临时工作空间设置为 in_memory 工作空间。仅当您确定输出是简单的要素和表时,才可对其使用 in_memory 工作空间。
在使用内存中的工作空间时请务必小心,仅当您确定数据集较小时才可将其写入 in_memory 工作空间。