下面给出的功能是PostGIS栅格的用户可能需要的,并且目前在PostGIS栅格中可用。还有其他功能是对一般用户不使用的栅格对象所需的支持功能。
raster
是一种新的PostGIS类型,用于存储和分析栅格数据。
有关从栅格文件加载栅格的信息,请参阅 Section 11.1, “加载和创建栅格”
对于本参考中的示例,我们将使用由以下代码构成的虚拟栅格的栅格表
CREATE TABLE dummy_rast(rid integer, rast raster); INSERT INTO dummy_rast(rid, rast) VALUES (1, ('01' -- little endian (uint8 ndr) || '0000' -- version (uint16 0) || '0000' -- nBands (uint16 0) || '0000000000000040' -- scaleX (float64 2) || '0000000000000840' -- scaleY (float64 3) || '000000000000E03F' -- ipX (float64 0.5) || '000000000000E03F' -- ipY (float64 0.5) || '0000000000000000' -- skewX (float64 0) || '0000000000000000' -- skewY (float64 0) || '00000000' -- SRID (int32 0) || '0A00' -- width (uint16 10) || '1400' -- height (uint16 20) )::raster ), -- Raster: 5 x 5 pixels, 3 bands, PT_8BUI pixel type, NODATA = 0 (2, ('01000003009A9999999999A93F9A9999999999A9BF000000E02B274A' || '41000000007719564100000000000000000000000000000000FFFFFFFF050005000400FDFEFDFEFEFDFEFEFDF9FAFEF' || 'EFCF9FBFDFEFEFDFCFAFEFEFE04004E627AADD16076B4F9FE6370A9F5FE59637AB0E54F58617087040046566487A1506CA2E3FA5A6CAFFBFE4D566DA4CB3E454C5665')::raster);
exclude_nodata_value
设置为False,则所有像素都包括 nodata
像素被视为相交并返回值。如果 exclude_nodata_value
不传入,然后从栅格元数据中读取它。NODATA
由Columnx和Rowy或在与栅格相同的空间参考坐标系中表示的几何点指定的给定波段的像素值。 NODATA
由ColumnX和Rowy指定的给定波段像素周围的值,或在与栅格相同的空间参考坐标系中表示的几何点。 crop
未指定或为TRUE,则将裁剪输出栅格。当GDAL打开一个文件时,GDAL会急切地扫描该文件的目录,以构建其他文件的目录。如果该目录包含许多文件(例如数千个、数百万个),则打开该文件将变得极其缓慢(特别是如果该文件恰好位于网络驱动器上,如NFS)。
为了控制此行为,GDAL提供了以下环境变量: GDAL_DISABLE_READDIR_ON_OPEN 。设置 GDAL_DISABLE_READDIR_ON_OPEN
至 TRUE
禁用目录扫描。
在Ubuntu中(假设您使用的是用于Ubuntu的PostgreSQL包), GDAL_DISABLE_READDIR_ON_OPEN
可以设置为 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/environment (其中,PostgreSQL_Version是PostgreSQL的版本,例如9.6,CLUSTER_NAME是集群的名称,例如maindb)。您还可以在此处设置PostGIS环境变量。
# environment variables for postmaster process
# This file has the same syntax as postgresql.conf:
# VARIABLE = simple_value
# VARIABLE2 = 'any value!'
# I. e. you need to enclose any value which does not only consist of letters,
# numbers, and '-', '_', '.' in single quotes. Shell commands are not
# evaluated.
POSTGIS_GDAL_ENABLED_DRIVERS = 'ENABLE_ALL'
POSTGIS_ENABLE_OUTDB_RASTERS = 1
GDAL_DISABLE_READDIR_ON_OPEN = 'TRUE'
假设系统由人类用户使用,Linux和PostgreSQL允许的最大打开文件数通常是保守的(通常为每个进程1024个打开文件)。对于Out-DB Raster,单个有效的查询很容易超过这一限制(例如,一个包含10年栅格的数据集,其中每一天都有一个包含最低和最高温度的栅格,我们想知道该数据集中一个像素的绝对最小值和最大值)。
最容易进行的更改是以下PostgreSQL设置: max_files_per_process 。默认设置为1000,这对于Out-DB Raster来说太低了。安全的起始值可能是65536,但这实际上取决于您的数据集以及针对这些数据集运行的查询。此设置只能在服务器启动时进行,而且可能只能在PostgreSQL配置文件中进行(例如 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/postgresql.conf 在Ubuntu环境中)。
...
# - Kernel Resource Usage -
max_files_per_process = 65536 # min 25
# (change requires restart)
...
要做的主要更改是Linux内核的打开文件限制。这包括两个部分:
整个系统的最大打开文件数
每个进程打开的最大文件数
您可以使用以下示例检查整个系统当前打开的最大文件数:
$ sysctl -a | grep fs.file-max fs.file-max = 131072
如果返回的值不够大,请将文件添加到 /etc/sysctl.d/ 如下例所示:
$ echo "fs.file-max = 6145324" >> /etc/sysctl.d/fs.conf $ cat /etc/sysctl.d/fs.conf fs.file-max = 6145324 $ sysctl -p --system * Applying /etc/sysctl.d/fs.conf ... fs.file-max = 2097152 * Applying /etc/sysctl.conf ... $ sysctl -a | grep fs.file-max fs.file-max = 6145324
我们需要为PostgreSQL服务器进程增加每个进程打开的最大文件数。
要查看当前的PostgreSQL服务进程正在使用的最大打开文件数,请按照以下示例执行操作(确保正在运行PostgreSQL):
$ ps aux | grep postgres
postgres 31713 0.0 0.4 179012 17564 pts/0 S Dec26 0:03 /home/dustymugs/devel/postgresql/sandbox/10/usr/local/bin/postgres -D /home/dustymugs/devel/postgresql/sandbox/10/pgdata
postgres 31716 0.0 0.8 179776 33632 ? Ss Dec26 0:01 postgres: checkpointer process
postgres 31717 0.0 0.2 179144 9416 ? Ss Dec26 0:05 postgres: writer process
postgres 31718 0.0 0.2 179012 8708 ? Ss Dec26 0:06 postgres: wal writer process
postgres 31719 0.0 0.1 179568 7252 ? Ss Dec26 0:03 postgres: autovacuum launcher process
postgres 31720 0.0 0.1 34228 4124 ? Ss Dec26 0:09 postgres: stats collector process
postgres 31721 0.0 0.1 179308 6052 ? Ss Dec26 0:00 postgres: bgworker: logical replication launcher
$ cat /proc/31718/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 15738 15738 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 15738 15738 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
在上面的示例中,我们检查了进程31718的打开文件限制。无论是哪个PostgreSQL进程,任何一个都可以。我们感兴趣的回应是 最大打开文件数 。
我们想要增加 软限制 和 硬限制 的 最大打开文件数 大于我们为PostgreSQL设置指定的值 max_files_per_process
。在我们的示例中,我们设置 max_files_per_process
到65536。
在Ubuntu中(假设您使用的是用于Ubuntu的PostgreSQL包),更改 软限制 和 硬限制 就是编辑 /etc/init.d/postgresql (SysV)或 /lib/systemd/system/postgresql*.service (System D)。
让我们首先讨论SysV Ubuntu案例,在该案例中,我们添加了 ULIMIT-H-N 262144 和 Ulimit-n 131072 至 /etc/init.d/postgresql 。
...
case "$1" in
start|stop|restart|reload)
if [ "$1" = "start" ]; then
create_socket_directory
fi
if [ -z "`pg_lsclusters -h`" ]; then
log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
exit 0
fi
ulimit -H -n 262144
ulimit -n 131072
for v in $versions; do
$1 $v || EXIT=$?
done
exit ${EXIT:-0}
;;
status)
...
现在来谈一谈system d Ubuntu案例。我们将添加 LimitNoFile=131072 致每一位 /lib/systemd/system/postgresql*.service 文件中的 [服务] 部分。
...
[Service]
LimitNOFILE=131072
...
[Install]
WantedBy=multi-user.target
...
进行必要的系统ID更改后,请确保重新装载守护进程
systemctl daemon-reload