将大型栅格数据集加载到 ArcSDE 中
此主题仅适用于 ArcEditor 和 ArcInfo。
鉴于数据的特性,栅格往往占用较大的空间。在数据库管理系统 (DBMS) 中,栅格数据集和栅格目录很少有小于几千兆字节 (GB) 的情况,通常都会占用几兆兆字节 (TB)。即便对于经验最丰富的数据库管理员 (DBA) 来讲,处理大型的栅格数据也是一种挑战。本主题向您介绍了将大量栅格数据加载到栅格数据集或栅格目录中的基本步骤。假定您已经决定将栅格存储在 ArcSDE 地理数据库中。
大型栅格数据集的构建主要包括三个过程:准备加载数据、加载数据以及验证和确认最终产品。具体涉及下列任务:
准备加载数据
- 配置系统
- 估计 DBMS 存储空间的大小
- 分配 DBMS 存储空间
加载数据
- 准备源数据
- 创建栅格对象
- 将栅格数据加载到栅格中
- 构建 DBMS 统计数据
- 构建栅格统计数据
验证和确认
- 查看最终产品
配置系统
配置系统的目标有两个:配置 DBMS 和配置 ArcSDE。
配置 DBMS 参数
ESRI 所支持的每个 DBMS 的配置都是唯一的,但基本目标是相同的,即:尽可能增加数据库的数据吞吐量。要加载大量的栅格数据,应优化 DBMS 的写入性能;不过,如果为加载几百千兆字节或更多字节的栅格数据而对 DBMS 进行了优化,则会影响使用相同资源完成其他任务的其他应用程序的性能。因此,建议如下:如果 DBMS 不是专用于加载栅格数据,您可能需要考虑重新配置系统并在非高峰时间加载栅格数据以避免影响其他应用程序的工作,或创建专用于加载栅格数据的 DBMS 的单独实例。
在 SQL Server、Oracle、DB2 和 Informix 中存储栅格数据时有一些指导原则。下面列出的信息重点强调了在这些原则的任意一个原则中都可以找到的信息。
配置 SQL Server DBMS 参数
- 仅当服务器上有其他应用程序运行时才管理 SQL Server 消耗的资源。
- 使用轻量级池化操作减少线程上下文切换的次数。
- 如有可能,将数据库还原模型设置为“简单”。这是因为加载栅格数据集期间没有必要还原到特定时间点,而且进行全部记录将不必要地增大日志的大小。
- 禁用 autoclose 和 autoshrink,因为它们对性能将产生负面影响。
要了解详细信息,请参阅 SQL Server 地理数据库 (geodatabase) 中的栅格数据集和栅格目录。
配置 Oracle DBMS 参数
- 配置仅在联机重做日志切换时才出现的检查点间隔。Oracle DBA 将 Oracle 初始化参数 LOG_CHECKPOINT_INTERVAL 和 LOG_CHECKPOINT_TIMEOUT 设置为 0。这么做可以强制检查点在日志切换时出现。
- 将每个联机重做日志文件的大小都增加到至少 1 GB。
- 增加 DB_BUFFER_CACHE 的大小,以提高存储脏数据块的数据块缓冲器高缓。
- 创建数据块大小为 8 KB 的 Oracle 数据库。这是最适和存储 BLOB 数据的数据块大小,已经成为所有 ArcGIS 二进制数据的基本默认存储类型。使用 16 KB 或 32 KB 的较大数据块很有可能造成 BLOB 日志段内空间的浪费。要想彻底了解 BLOB 存储,请参考 Oracle 的文档。
要了解详细信息,请参阅存储在 Oracle 中的地理数据库内的栅格数据集和栅格目录。
配置 DB2 DBMS 参数
- 为栅格表空间创建单独的缓冲池。
- 为存储栅格块表的表空间创建大型缓冲池。
- 如果 DB2 安装在 AIX 平台上,请参阅下列参数:
- db2set DB2_MMAP_READ=OFF
- db2set DB2_MMAP_WRITE=OFF
要了解详细信息,请参阅 DB2 地理数据库 (geodatabase) 中的栅格数据集和栅格目录。
配置 Informix DBMS 参数
配置 onconfig 参数:
- 将 BUFFERS 设置为足够大,以保证优先于清洁程序。
- 将 LOGSIZE 设置为 100000。
- 确保 rootdbs dbspace 内没有创建物理日志。
- 将 LOG_BACKUP_MODE 设置为连续备份逻辑日志。
- 将 LOGSMAX 设置为 100。
- 将 RA_PAGES 设置为 125。
- 将 RA_THRESHOLD 设置为 85。
- 将 RESIDENT 设置为 -1。
- 如果想使用直连,请将 NETTYPE 参数设置为支持远程连接。
要了解详细信息,请参阅 Informix 地理数据库 (geodatabase) 中的栅格数据集和栅格目录。
配置 ArcSDE 服务器
ArcSDE 使用传输缓冲区在 ArcSDE 客户端和 ArcSDE 服务器之间传输数据。执行写入操作期间,当客户端的数据缓冲区达到其阈值时,它将刷新到 ArcSDE 服务器。在 ArcSDE 服务器处理该缓冲区的同时,ArcSDE 客户端将接受更多的数据到其缓冲区中。达到阈值后,客户端将再次发送其缓冲区,但仅当 ArcSDE 服务器处于等待状态时,才能执行此操作。对于栅格数据,传输缓冲区的大小由 ArcSDE RASTERBUFSIZE 服务器参数控制。默认情况下,该参数设置为 200 KB,这对于大多数加载操作已经足够了。ArcSDE 将由 RASTERBUFSIZE 指定的内存量的两倍分配给 ArcSDE 客户端和服务器上的缓冲区。因此,如果使用推荐的 200 KB 的默认值,那么将有 400 KB 分配给客户端,另有 400 KB 分配给服务器。除了传输缓冲区以外,ArcSDE 还将分配另三个缓冲区给服务器,用于与 DBMS 之间读写数据。这样,分配给服务器的内存总量增加到 1000 KB。如果您使用的是直连,那么 ArcSDE 客户端和服务器的功能将在客户端的计算机上运行;因此,由直连分配的内存的大小是由 RASTERBUFSIZE 指定的大小的七倍。如果 RASTERBUFSIZE 默认大小不够大,无法适应栅格分块的解压缩大小,那么您只需更改 RASTERBUFSIZE 的大小。栅格分块的解压缩大小可通过将分块的宽度乘以高度与像素深度系数来确定。例如,如果分块的宽度和高度使用 128 乘 128 的默认值,则这两个值的乘积是 16,384。将这个乘积乘以下表中的像素深度系数,以得到栅格分块的解压缩大小。如果像素深度是 32,则解压缩大小的计算结果为 65,536 个字节。该值恰好小于 200 KB 的默认值。不过,如果您决定将分块大小增加到 256 乘 256,那么,解压缩大小就会增至 262,144 个字节。如果不增加 RASTERBUFSIZE 参数的大小,就有出现 SE_RASTER_BUFFER_TOO_SMALL (-294) 错误的风险。在这种情况下,您需要将 RASTERBUFSIZE 参数的大小增至约 300 KB。
像素深度 | 像素深度系数 |
---|---|
1 位 | 0.125 |
4 位 | 0.25 |
8 位 | 1 |
16 位 | 2 |
32 位 | 4 |
64 位 | 8 |
sdeconfig -o alter -v RASTERBUFSIZE=10240000 -u sde -p esri
实际上,是对存储新值的 SDE.SERVER_CONFIG 表作出了更改。该值将影响参数更改后建立连接的所有 ArcSDE 会话。
RASTERBUFSIZE 参数增大到可以容纳栅格分块的解压缩大小即可,而不应超过这个大小。事实上,将参数设置得过大不利于系统中的栅格数据流。
连接架构
构造分辨率递减的金字塔是一种多线程、处理器密集型的操作。该任务由 ArcSDE 服务器的功能来执行。通过将服务器功能配置在客户端/服务器架构内 CPU 能力最强的计算机上,数据库的栅格数据吞吐量将变得更大。将 CPU 的数量乘以其处理器速度就可以确定 CPU 的能力。
服务器功能可以独立运行,这与连接到 ArcSDE 服务时的情况相同;也可以嵌入到客户端的应用程序(例如 ArcCatalog)中,这与建立直连时的情况相同。
加载栅格数据时是否使用直连取决于托管 ArcSDE 服务的客户端计算机或服务器上的 CPU 能力是否非常强大。要在客户端计算机上构建金字塔,如果 CPU 能力比较强大,则可以使用直连。
您还必须考虑托管 ArcSDE 服务的服务器计算机的容量。服务器计算机可能比客户端计算机强大,但是服务器计算机可能已经接近了为其他应用程序请求提供服务的极限。如果服务器计算机尚未达到其极限并且强于客户端计算机,那么可以连接到 ArcSDE 服务。
估计 DBMS 存储空间的大小
建议您在启动大型栅格数据加载项目前,先组织 DBMS 存储空间。为此,需要估计出在数据库中存储栅格数据所需的空间以及加载图像文件前缓冲这些图像文件所需的空间。估计出所需的磁盘空间后,可以分配 DBMS 空间,设置 ArcSDE DBTUNE 参数,然后开始加载栅格数据。
目前,在栅格的表和索引中,栅格 BLK 表是最大的。它通常比第二大 DBMS 对象(即栅格块表的复合索引)大 150 倍。其余的栅格对象的表和索引则小了数千倍,并且通常与栅格块表的复合索引一起组合到同一 DBMS 存储空间中。由于栅格块表比其他所有对象大得多,所以估计栅格数据的大小主要是针对栅格块表进行的。
对于栅格数据集和栅格目录,像素数据存储在 DBMS 内的 BLK 表中。而镶嵌数据集引用栅格数据集,没有将像素数据存储在 BLK 表中。BLK 表将一直为空,除非镶嵌数据集的金字塔存储在 DBMS 中。
有两种基本方法可以估计栅格块表在数据库中所占的空间大小。一种方法需要加载若干样本图像并根据样本所占空间的大小来推断栅格块表预计在数据库中所占空间的总大小。另一种方法尝试根据一个公式来计算所需空间,在这个公式中,预期的栅格对象的属性用作输入。通常,第一种方法的估计结果优于后者,但是,如果构造数据库前,源数据不可用,那么运用公式的那种方法就非常有用。要准确地估计栅格块表的大小,必须先确定出下列影响栅格块表的存储大小的属性:
根据样本估计栅格块表的大小
使用 ArcCatalog 加载若干样本栅格数据集来创建一个小型的栅格对象。该栅格对象应该和它所要表示的最终栅格对象具有相同的压缩类型、压缩质量、像素深度、波段数和分块大小。这些栅格属性将影响栅格对象在数据库内的存储大小。
使用 ArcCatalog 加载样本栅格数据后,确定样本栅格对象块表在数据库中所占空间的大小。
对于 Oracle,可通过查询栅格对象栅格块表的 Oracle USER_TABLES 系统表的 BLOCKS 列来确定。为此,首先,需要确定栅格对象的栅格块表的名称,而这又需要从 SDE.RASTER_COLUMN 表中获取 rastercolumn_id。
本文档中的下列示例假定样本栅格对象的业务表的名称是 EARTH。
- 获取栅格对象的 rastercolumn_id。
SQL> select rastercolumn_id from sde.raster_columns where table_name = 'EARTH'; RASTERCOLUMN_ID =--------------- 14
- 使用下列查询获取栅格块表的大小。
SQL> exec dbms_stats.gather_table_stats (NULL,'EARTH'); SQL> select sum(length(rasterband_id)) + sum(length(rrd_factor)) + sum(length(row_nbr)) + sum(length(col_nbr)) + sum(length(block_data)) "total size" from sde_blk_14; total size =----------- 762707968
栅格块表的总大小是 762,707,968 个字节,或大约 727 MB。
-
确定样本栅格数据集的大小与要加载的所有源栅格数据集文件的总大小的比值。该样本的大小是 2 GB,而数据供应商提供的所有栅格数据集文件的总大小约 3 TB。
首先,将文件总大小的 3 兆兆字节转换为千兆字节:
3 TB * 1024 = 3072 GB
栅格数据集总大小与样本大小的比值计算为:
total size of all rasters / sample raster size = total size to sample size
例如:
3072 / 2 = 1536
- 将栅格数据集总大小与样本大小的比值乘以存储在数据库中的样本的大小,可以粗略地估计出存储栅格对象中所有栅格数据集文件所需的磁盘空间的总大小。
727 MB * 1536 = 1,116,672 MB = 1090 GB = 1.06 TB
要确定 SQL Server 中样本的大小,首先要得到样本的大小,然后执行上面的步骤 3。
- 获取栅格的 rastercolumn_id。
1> select rastercolumn_id 2> from sde.sde_raster_columns 3> where table_name = 'EARTH'; rastercolumn_id =-------------- 3
- 使用 ID 来确定样本数据使用的空间。
1> exec sp_spaceused 'sde_blk_3'; 2> go name rows reserved data index_size used =-------------------------------------------------------------- SDE_blk_3 4233 29712 KB 29632 KB 16 KB 64 KB
在这种情况下,原始栅格数据集的大小是 50 MB,但加载后,所使用的空间是 29,632 KB + 16 KB = 29,648 KB,或大约 29 MB。
根据公式估计栅格块表的大小
下面的公式法可以粗略地估计出栅格块表的大小。如果源数据部分可用或全部可用,您应该使用先前介绍的方法来估计栅格块表,这是因为那个方法更加准确。
- 粗略估计范围(使用米或英尺)。对于像素分辨率单位使用米(例如:5 米、15 米或 150 米)的栅格数据集,使用那些单位获得估计范围。同样,如果分辨率用英尺或英寸来表示,则使用那些单位获得估计范围。使用 ArcMap 创建图像范围的面轮廓也可以得出范围,而且是个不错的方法。您需要尽可能地估计出空空间,这是由于地理数据库不存储空块。
-
将范围转换为像素。
(Extent of raster in pixel units) / (pixel resolution) = Number of pixels
对于分辨率为 15 米、范围为 450 平方千米的源栅格数据集,转换为像素的计算方法如下:
(km2 to m2 conversion factor) / (the pixel resolution in m2) = pixels (450 km2 * 1,000,000) / (15 x 15) = 2,000,000 pixels
还可以考虑分辨率是 1 英尺、范围是 50 平方英里的情况,作为另一个示例。估计的像素范围可用如下方法近似计算:
(mi2 to ft2 conversion factor) / (the pixel resolution in ft2) = pixels (50 mi2 * 52802)/ (1 x 1) = 1,393,920,000 pixels
- 乘以波段数。如果是单波段灰度或黑白栅格数据集,可以跳过该步骤。对于该示例,假定步骤 2 中 15 米分辨率的数据有三个波段(表示 RGB)。
2,000,000 pixel extent * 3 bands = 6,000,000 pixels
- 利用表中的像素深度系数来转换为字节。
像素深度的像素字节系数列表像素深度
字节系数
1 位
0.125
4 位
0.25
8 位
1
16 位
2
32 位
4
64 位
8
8-bit data: 6,000,000 pixels * 1 = 6,000,000 Bytes / 10242 = 5.7 MB 16-bit data: 6,000,000 pixels * 2 = 12,000,000 Bytes / 10242 = 11.4 MB
- 添加分辨率递减的金字塔。分辨率递减的金字塔可以将栅格的大小扩大三分之一。因此,将步骤 4 中的字节数乘以 1.33。
5.72 MB * 1.33 = 7.67 MB
- 应用栅格压缩。下表给出了一个示例,显示出在给定压缩和质量的情况下预期的节约值。确切的值视使用中的数据而不同。
压缩类型所对应的压缩系数压缩类型
压缩系数
LZ77
0.5
JPEG 75%
0.15
JPEG 50%
0.1
JPEG 2000 80/100
0.36
JPEG 2000 60/100
0.15
JPEG 2000 55/100
0.11
JPEG 2000 50/100
0.07
JPEG 2000 45/100
0.06
- 继续步骤 5 中的示例并应用质量为 50% 的 JPEG 压缩,然后将字节数乘以压缩系数 0.1。
7.67 MB * 0.1 = 0.77 MB
- 增大对 DBMS 开销和栅格块表整型列的估计。步骤 7 中的值是对栅格块表中存储的像素数据所需的绝对空间大小的估计。根据创建栅格对象时所选的分块大小,像素被分成若干个块。这些像素块存储在数据库的数据块中。由于压缩的可变性,栅格块不会完全适合。总有一部分块空间未被使用。此外,栅格块表还可存储四个整型列以及像素 BLOB 列,以唯一地识别每个块。整型列也会增加存储上的开销。将步骤 7 中的估计至少增大 10%,以解决 DBMS 开销和栅格块表的整型列。
分配 DBMS 存储空间
如何创建 DBMS 存储空间取决于需要如何对其管理。有些 DBMS 允许移动数据库的数据文件,因此建议您将所有栅格表和索引存储在一个空间内。如果传输数据不存在问题,那么请根据对象大小创建存储空间:对于块表及其索引,创建大型空间;对于其他栅格表及其索引,创建小型空间。
有些 DBMS 允许自动增长 DBMS 空间;不过,应该预分配空间以确保加载期间不会出现问题。由于已经不得不估计数据的空间要求,最好对其分配空间。
创建 Oracle DBMS 存储空间
- 创建非栅格块的表空间。
create tablespace earth datafile 'd:\oradata\earth.dbf' size 500M extent management local uniform size 1M;
- 创建栅格块的表空间。
create tablespace earth_blocks datafile 'e:\oradata\earth_blocks.dbf' size 50000M extent management local segment space management manual uniform size 100M;
创建 SQL Server DBMS 存储空间
- 创建大到足以存储整个栅格对象的 SQL Server 数据库。
创建 DB2 DBMS 存储空间
- 创建存储所有非栅格块数据的表空间。
create tablespace earth managed by database using (file 'd:\earth.dat' 500000);
- 创建存储栅格块表数据的表空间。
create long tablespace earth_blocks managed by database using (file 'e:\earth_blocks.dat' 50000000);
创建 Informix DBMS 存储空间
- 创建 dbspace 以存储所有非栅格块表。
onspaces -c -d earth -p d:\earth.dbs -o 0 -s 5000
- 创建 dbspace 以存储栅格块表。
onspaces -c -d earth_blocks -p e:\earth_blocks.dbs -o 0 -s 50000000
配置 DBTUNE 关键字
SDE.DBTUNE 表保存有 ArcSDE 用来在数据库中创建表和索引的存储参数。存储参数按照关键字进行组织。通过在创建栅格等地理数据库对象期间指定 DBTUNE 关键字,您可以指定创建地理数据库对象的表和索引的方式以及表和索引所位于的数据库存储单元。
栅格的每个表和索引的组合都有其对应的 DBTUNE 存储参数。通过附加上新的关键字(后跟每个存储参数的规范),您可以编辑 SDEHOME/etc/dbtune.sde 文件。下面是相关的示例。然后执行 sdedbtune 导入操作来更新 SDE.DBTUNE 表。
存储参数视 DBMS 的情况可能有所不同。11 Oracle DBTUNE 存储参数列在下面;不过,其中的许多参数也经常出现在其他 DBMS 中。
- 业务表的存储参数是 B_STORAGE,并且,如果业务表具有 ArcSDE 的注册行 ID 列,则其存储参数为 B_INDEX_ROWID。栅格数据集的业务表仅含有一个行,因此非常小。栅格目录的业务表通常很小,对于每个栅格数据集只包含一行。
B_STORAGE 和 B_INDEX_ROWID 存储参数的示例如下:
B_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" B_INDEX_ROWID "PCTFREE 0 INITRANS 4 TABLESPACE EARTH"
- 栅格表的存储由 RAS_STORAGE 参数控制,而该表中 raster_id 索引的存储由 RAS_INDEX_ID 参数控制。栅格数据集的栅格表仅含有一个行,因此非常小。栅格目录的栅格表通常很小,对于每个栅格数据集只能存储一行。
RAS_STORAGE 和 RAS_INDEX_ID 存储参数的示例如下:
RAS_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" RAS_INDEX_ID "PCTFREE 0 INITRANS 4 TABLESPACE EARTH"
- 栅格波段表根据 BND_STORAGE 存储参数来存储。BND_INDEX_ID 控制 rasterband_id 索引的存储,BND_INDEX_COMPOSITE 存储参数控制 sequence_nbr 和 raster_id 列中复合索引的存储。栅格波段表通常很小,仅略大于栅格对象的栅格表或业务表,该表针对每个栅格波段存储一个记录。对于存储 1,000 个三波段栅格数据集的栅格目录,栅格波段表将含有 3,000 个记录。
BND_STORAGE、BND_INDEX_COMPOSITE 和 BND_INDEX_ID 存储参数的示例如下:
BND_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" BND_INDEX_COMPOSITE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" BND_INDEX_ID "PCTFREE 0 INITRANS 4 TABLESPACE EARTH"
- AUX_STORAGE 存储参数控制栅格辅助表的存储,而 AUX_INDEX_COMPOSITE 存储参数控制表的复合索引的存储。栅格辅助表的记录数视存储的可选栅格波段数据而不同。为了达到较高的效率,针对每个栅格波段,仅当位掩码小于 10 MB 时,才存储 NoData 位掩码;否则,不存储位掩码,ArcSDE 必须从存储在栅格块表内的像素块中检索 NoData 位掩码。如果已经计算出栅格统计数据,还将存储栅格统计数据;如果存在色彩映射表,则还将存储色彩映射表。对于给定的栅格对象,栅格辅助表可能为空,也可能含有的记录多于栅格波段表。这通常与栅格波段表的大小有关。
AUX_STORAGE 和 AUX_INDEX_COMPOSITE 存储参数的示例如下:
AUX_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" AUX_INDEX_COMPOSITE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH"
- BLK_STORAGE 控制栅格块表的存储;在栅格对象的表和索引中,栅格块表是最大的。栅格块表存储创建栅格对象时由分块大小定义的像素数据。BLK_INDEX_COMPOSITE 控制栅格块表的复合索引的存储,可以索引四个整型列 rasterband_id、row_nbr、col_nbr 和 rrd_factor。栅格块表比其索引大 150 倍左右。不过,由于栅格块表可以变得很大,所以实际上,可以将栅格块表的索引和栅格块表存储在同一表空间内。
BLK_STORAGE 和 BLK_INDEX_COMPOSITE 存储参数的示例如下:
BLK_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH_BLOCKS STORAGE (INITIAL 500M MINEXTENTS 10) LOB( BLOCK_DATA) STORE AS (ENABLE STORAGE IN ROW CHUNK 8K RETENTION CACHE)" BLK_INDEX_COMPOSITE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH_BLOCKS"
栅格数据集和栅格目录的轮廓线存储在空间列内。如果空间列是按照 ArcSDE 二进制类型而创建的,则需要配置下列 DBTUNE 存储参数:
- S_STORAGE - 空间索引表
- S_INDEX_ALL - coverage 索引,列出空间索引表的所有列
- S_INDEX_SP_FID - 空间索引表的 fid 列索引
关于 DBTUNE 关键字在每个 DBMS 的 DBTUNE 文件中的显示方式,其示例如下。双井号 (##) 表示 EARTH DBTUNE 关键字的开始,而 END 表示关键字的结束。
SQL Server DBTUNE 关键字示例
##EARTH_15M B_CLUSTER_ROWID 0 B_CLUSTER_SHAPE 1 B_CLUSTER_RASTER 0 B_INDEX_ROWID "WITH FILLFACTOR = 100" B_INDEX_SHAPE "WITH FILLFACTOR = 100" B_INDEX_RASTER "WITH FILLFACTOR = 100" B_STORAGE "" B_TEXT_IN_ROW 256 RAS_STORAGE "" RAS_CLUSTER_ID 1 RAS_INDEX_ID "WITH FILLFACTOR = 100" BND_STORAGE "" BND_CLUSTER_ID 0 BND_INDEX_ID "WITH FILLFACTOR = 100" BND_CLUSTER_COMPOSITE 0 BND_INDEX_COMPOSITE "WITH FILLFACTOR = 100" AUX_STORAGE "" AUX_CLUSTER_COMPOSITE 1 AUX_INDEX_COMPOSITE "WITH FILLFACTOR = 100" BLK_STORAGE "" BLK_CLUSTER_COMPOSITE 1 BLK_INDEX_COMPOSITE "WITH FILLFACTOR = 100" END
Oracle DBTUNE 关键字示例
##EARTH_15M RAS_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" RAS_INDEX_ID "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" BND_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" BND_INDEX_COMPOSITE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" BND_INDEX_ID "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" AUX_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" AUX_INDEX_COMPOSITE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH" BLK_STORAGE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH_BLOCKS STORAGE (INITIAL 500M MINEXTENTS 10) LOB( BLOCK_DATA) STORE AS (ENABLE STORAGE IN ROW CHUNK 8K RETENTION CACHE)" BLK_INDEX_COMPOSITE "PCTFREE 0 INITRANS 4 TABLESPACE EARTH_BLOCKS" END
DB2 DBTUNE 关键字示例
##EARTH_15M AUX_STORAGE "IN EARTH INDEX IN EARTH" BLK_STORAGE "IN EARTH INDEX IN EARTH LONG IN EARTH_BLOCKS" BND_STORAGE "IN EARTH INDEX IN EARTH" RAS_STORAGE "IN EARTH INDEX IN EARTH" END
Informix DBTUNE 关键字示例
##EARTH_15M RAS_STORAGE "EXTENT SIZE 16 NEXT SIZE 16 LOCK MODE ROW IN EARTH" RAS_INDEX_ID "FILLFACTOR 90 IN EARTH" BND_STORAGE EXTENT SIZE 16 NEXT SIZE 16 LOCK MODE ROW IN EARTH" BND_INDEX_COMPOSITE "FILLFACTOR 90 IN EARTH" BND_INDEX_ID "FILLFACTOR 90 IN EARTH" AUX_STORAGE "EXTENT SIZE 16 NEXT SIZE 16 LOCK MODE ROW IN EARTH" AUX_INDEX_COMPOSITE "FILLFACTOR 90 IN EARTH" BLK_STORAGE "EXTENT SIZE 1000 NEXT SIZE 1000 LOCK MODE ROW IN EARTH_BLOCKS" BLK_INDEX_COMPOSITE "FILLFACTOR 90 IN EARTH" END
准备源数据
为使用栅格数据集源文件,请将栅格数据集源文件缓冲到磁盘驱动器并确保 ArcCatalog 或用于将数据加载到地理数据库中的 ArcObjects 脚本可以访问这些驱动器。
CD 或 DVD
如果栅格数据集在 CD 或 DVD 上,将它们复制到高速硬盘上。本地硬盘优于网络硬盘。不建议从 CD 设备或 DVD 设备直接加载文件,这是由于其读取速度比硬盘慢得多。
磁带筒
如果从磁带筒加载,那么开始加载之前,要加载的栅格数据集文件应该缓冲到联机缓存。
组织源数据
图像文件应该组合到供加载操作使用的独立文件夹中。这样,加载工具就可以打开文件夹内的所有文件并批量加载这些文件,而无需逐个加载每个文件。例如,您可以将若干栅格数据集镶嵌到单一的栅格数据集中;将每个栅格数据集的输入加载到单一、独立的栅格数据集中;将多个栅格数据集组合到一个栅格目录中;或者使用多个镶嵌的栅格数据集来创建栅格目录。不同操作系统允许打开的文件的数量不同。因此,如果达到了允许的限度,则需要创建其他文件夹,开始另一个加载过程。
对源数据应用投影
可使用两种基本工作流来投影栅格数据。您可以通过创建源图像文件的另一副本来应用投影,也可以在将源图像文件插入地理数据库时应用投影。
测试表明:通常情况下,最佳的工作流程是将投影应用于栅格数据集源文件的副本,并将投影后的栅格数据集源插入到地理数据库。在加载期间投影栅格数据集源文件可能确实略快于创建一个投影的中间源文件,但是如果使用多个过程同时插入很多栅格数据集源,最好还是在客户端先缓冲投影的栅格数据集源文件,然后将文件加载到服务器,这是因为投影栅格数据需要大量的时间。由于有多个过程创建投影的栅格数据集源文件,同时有几个过程将投影的文件插入到地理数据库中,您实际上是在最大化地利用客户端计算机和服务器计算机的资源,这样就避免了空闲的服务器由于突然忙碌起来从而导致服务器的资源有时超出负荷。
创建栅格对象并加载栅格数据
如果不是只想存储多个独立的栅格数据集,建议您创建含有要加载的若干栅格数据集的栅格目录或单个栅格数据集。不过,无论何时,您都需要清楚要加载的栅格数据集的属性及加载后栅格数据集将要具有的属性。
估计存储大小要求或分配存储空间时,您可能已经确定了这些属性。你还可能已经编辑了 dbtune 以创建指定所有存储参数的关键字。如果没有的话,那么现在您需要确定这些属性。
需要考虑四个栅格地理数据库设置:金字塔、栅格统计、压缩和分块大小。
建立金字塔将影响显示性能。
金字塔可在将栅格数据镶嵌到栅格数据集中时在栅格数据集上构建,也可以在加载完成时构建。完成镶嵌后构造金字塔是最快的方法。ArcGIS 允许构造部分金字塔,因此,在执行镶嵌操作期间,仅重新构建与源数据重叠的金字塔部分。这一点有助于更新镶嵌栅格数据集,因为如果添加了新的栅格数据集,则不需要通过整个栅格数据集重新构建金字塔。不过,如果在栅格数据集的原点(金字塔的参考点)更新数据,则需要为整个栅格数据集重新构建金字塔。
栅格数据集的原点就是栅格数据集左上角的坐标。金字塔于该坐标开始构造,然后向右、向下继续进行。栅格数据集的原点的左侧或上方镶嵌数据需要 ArcSDE 移动该点,以便原点仍然是左上角的坐标。移动现有栅格数据集的原点需要 ArcSDE 重新构建金字塔。重新构建金字塔可能是一种耗费成本的操作,尤其是在栅格数据集由于多个栅格数据集源文件(或其他栅格数据集)已经镶嵌到其上而增大的情况下。
因为重新构建金字塔是一种耗时的操作,您应该通过分析源数据来识别栅格数据集的左上栅格坐标,并在创建栅格数据集时输入该坐标。ArcSDE 允许在创建栅格对象时设置金字塔的参考点,从而不必使用所插入的第一个栅格数据集的左上坐标。因此,就可以通过在创建栅格数据集时设置金字塔的参考点来避免移动栅格数据集的原点。
要在 ArcMap 或 ArcCatalog 中执行一些地理处理操作或某些任务(例如应用对比度拉伸或分类数据),栅格数据集需要统计数据。
压缩由栅格数据的类型以及计划用途确定。
ArcSDE 将栅格数据集细分为一个或多个适于存储的分块。每个分块都作为二进制数据存储在栅格存储表中。如果栅格数据集是多波段的,则不同波段中重合的栅格块的像素存储在表中各自的行内。
对栅格数据集进行分块处理可以提高性能。例如,如果放大至仅含有四个分块的小区域,则 ArcSDE 只需要提取栅格块表中的四行。如果不将栅格分成若干分块,ArcSDE 将需要提取整个栅格数据集。
分块的大小根据创建每个分块时所用的行数和列数来确定。例如,128 乘 128 的分块大小实际上是 128 个像素乘 128 个像素。如果分块很大,则 BLOB 字段也很大,但表的行较少;而如果分块很小,则 BLOB 字段也很小,但表的行较多。默认情况下,分块大小设置为 128 个像素乘 128 个像素。如果所加载的数据不是三波段彩色影像,则修改分块大小并通过将分块与数据库块有效匹配可能会减少存储空间要求。要确定最佳的可能大小,需要对典型栅格进行基准测试。一般来说,如果分块大小较大,则压缩比也较高,且会使较小的分块存储在数据库中。
您可以使用地理处理工具(例如在 ArcCatalog 中)、sderaster 或 ArcObjects 来创建栅格对象。由地理处理工具创建的栅格对象是空的;这些栅格对象也具有属性,但是不含有任何像素数据,并具有地理数据库感知能力。要创建栅格数据集,请参阅在 ArcSDE 地理数据库中创建栅格数据集。要创建栅格目录,请参阅在 ArcSDE 地理数据库中创建栅格目录。
由 sderaster 创建的栅格对象总是含有像素数据。这些栅格对象没有地理数据库感知能力;它们缺少轮廓线列;如果进行镶嵌操作,坐标文件必须完全对齐。有关使用 ArcObjects 创建栅格的信息,请参阅 ESRI 开发人员网络从代码交换中获取可修改、使用的栅格数据的示例。例如,您可以复制并修改“创建地理数据库栅格数据集”示例,以创建新的独立栅格数据集。“将目录及子目录中的栅格镶嵌到 ArcSDE 栅格”示例提供了将目录或文件夹内的所有栅格数据集源镶嵌到给定的独立栅格数据集所需的实例代码。可通过“创建地理数据库栅格目录”示例来创建栅格目录。您可以将该示例同“将工作空间中的栅格数据集加载到 GDB 栅格目录”示例相结合,这样就可以将栅格数据集源文件插入栅格目录中。
尽管使用 ArcObjects 软件要求您或和您一样的用户拥有修改并执行实例代码的技能,但却可能带来下列好处:
- 引用含有许多栅格数据集源文件的目录,无需逐个输入栅格数据集源
- 添加控制流以成功处理源图像文件损坏等异常情况
可使用以下几种方法将栅格数据加载到地理数据库中:通过使用“导入栅格数据集”(地理数据库快捷菜单)、“复制栅格”工具(地理处理工具)或“加载数据”(ArcCatalog 数据集快捷菜单)。有关将栅格数据加载到地理数据库中的详细信息,请参阅导入栅格数据集。
有关通过 sderaster 加载栅格数据的信息,请参阅通过 sderaster 将栅格加载到 ArcSDE 中。
构建统计数据
构建关于 DBMS 和栅格的统计数据可以提高栅格的显示性能和外观。
并不是任何时候都需要构建 DBMS 统计数据;不过所有支持的 ArcSDE DBMS 都使用基于成本的优化方式。基于成本的优化方式使用从 DBMS 对象中预先收集的统计数据来确定最佳执行计划。SQL Server 在加载数据时自动收集统计数据,但是对于所有其他 DBMS,您必须至少在块表中生成 DBMS 统计数据。
要在 ArcCatalog 中构建 DBMS 统计数据,请执行下述操作:
- 右键单击栅格对象,然后单击“分析”。
- 在“分析组件”对话框上,确保“栅格表”组件已选中。
- 单击“确定”。
您可以使用 sdetable update_dbms_stats 操作生成统计数据,如下面的示例所示:
c:\>sdetable -o update_dbms_stats -t earth -m estimate -u mark -p mark -i 9000
下面是一个 Oracle 的示例,在该示例中,在块表中快速生成统计数据:
SQL> select rastercolumn_id from sde.raster_columns where table_name = 'EARTH'; RASTERCOLUMN_ID ----------------------- 1 SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(NULL, 'SDE)BLK_1; NULL, 1);
栅格统计数据可以生成在栅格数据集中,存储在 ArcSDE AUX 表内。栅格统计数据包括最小值、最大值、平均值和标准差。根据基础金字塔等级生成栅格统计数据需要大量的时间来处理大型的栅格数据集。
如果某种数据必需首先进行统计拉伸,然后才可通过人眼查看栅格中捕获的对象,那么对于这种数据而言,栅格统计数据是必要的。
要了解生成栅格统计数据的方法,请参阅栅格数据集统计数据。
查看栅格数据
应该通过栅格的专属项目所使用的应用程序查看栅格数据,例如,ArcMap、ArcCatalog、ArcGlobe 或 ArcScene 等。如果已构建金字塔并且 DBMS 统计数据是最新的统计数据,则栅格会快速显示。
如果显示速度很慢,则一般都是由于 DBMS 统计数据过时或不存在所致。块表内存在 DBMS 统计数据特别重要。请参考前一部分构建统计数据,获取构建 DBMS 统计数据的相关说明。
由于可以构造部分金字塔,现在可以在执行大型镶嵌操作期间查看栅格数据集。不过,在执行镶嵌操作期间,在低分辨率下查看栅格数据集时,如果栅格数据集周期性地时隐时现,那么请不必担心。这是由构造部分金字塔造成的;金字塔上面的等级被更新后,又被删除,然后又重新插入,就会出现这种情况。