下面给出的函数是 PostGIS 光栅用户可能需要且当前在 PostGIS 光栅中可用的函数。还有其他函数是光栅对象的必需支持函数,对普通用户没有用。
raster
是用于存储和分析光栅数据的 PostGIS 新类型。
有关从光栅文件加载光栅的信息,请参阅 第 9.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
值,该像素由列 x 和行 y 或以与栅格相同的空间参考坐标系表示的几何点指定。NODATA
值组成的 2-D 双精度数组,该像素由 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 栅格,一个有效的查询很容易超过此限制(例如,一个数据集包含 10 年的栅格,每个栅格代表一天,包含最低和最高温度,并且我们想要知道该数据集中某个像素的绝对最小值和最大值)。
最容易更改的是以下 PostgreSQL 设置:max_files_per_process。默认设置为 1000,对于 Out-DB 光栅来说太低了。一个安全的初始值可能是 65536,但这实际上取决于你的数据集和针对这些数据集运行的查询。此设置只能在服务器启动时进行,并且可能只能在 PostgreSQL 配置文件中进行(例如,在 Ubuntu 环境中为 /etc/postgresql/POSTGRESQL_VERSION/CLUSTER_NAME/postgresql.conf)。
...
# - 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(systemd)。
让我们首先解决 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)
...
现在来解决 systemd Ubuntu 案例。我们将在 [Service] 部分将 LimitNOFILE=131072 添加到 /lib/systemd/system/postgresql*.service 文件中。
...
[Service]
LimitNOFILE=131072
...
[Install]
WantedBy=multi-user.target
...
在进行必要的 systemd 更改后,请务必重新加载守护程序
systemctl daemon-reload