使用 GeoServer 提供大型栅格会导致 JAVA HEAP 内存不足
Serving large rasters using GeoServer results in JAVA HEAP out of memory
我在 GeoServer 上有非常大的栅格,例如 35000px X 30000px。(马赛克图像)
我目前正在做的是使用 WMS 下载这些图像,然后对该图像执行分析、修改(我正在为该图像的某些部分着色),然后将其上传回GeoServer 作为新层。
这适用于最大 20000px X 20000px 的图像,但之后 GeoServer 无法合并它们,而不是 geotiff 图像 returns 文件,其中包含 xml 内容:
错误 [geoserver.ows] -
java.lang.OutOfMemoryError: Java堆space
现在在 java 选项变量中,我插入 Xmx 为 22 GB 并在 运行 jetty Xmx[=23 的内部脚本中=] 被放置为 20GB。我使用 top 和 free -m 命令密切关注平均负载,使用的内存从未超过 8GB。
我的服务器有 28GB RAM 和 8 个处理器,CPU 负载从未超过 700%。
有人可以提示我做错了什么以及我该怎么做才能下载如此大的 Geotiff 图像。
顺便说一句,我正在使用码头作为服务器。
虽然我没有意识到为什么会出现此错误,但我设法使用 Web 覆盖服务 (WCS) 而不是 WMS 从 GeoServer 下载了整个栅格。
WCS 是下载大光栅图像的正确方法。
因此,如果有人偶然发现类似问题,我建议您像这样向地理服务器上的 wcs 服务发送 post 请求
POSThttp://192.168.4.162:9090/geoserver/wcs
并且随着数据传递 xml 描述您的图层(您可以使用 Geoserver 中的 demos 菜单下的 WCS 请求生成器创建它)。我的看起来像这样:
<?xml version="1.0" encoding="UTF-8"?><GetCoverage version="1.0.0" service="WCS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/wcs" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/wcs http://schemas.opengis.net/wcs/1.0.0/getCoverage.xsd">
<sourceCoverage>fiware:test</sourceCoverage>
<domainSubset>
<spatialSubset>
<gml:Envelope srsName="EPSG:4326">
<gml:pos>-87.3539257 38.3719729154</gml:pos>
<gml:pos>-87.3437449312 38.3783359</gml:pos>
</gml:Envelope>
<gml:Grid dimension="2">
<gml:limits>
<gml:GridEnvelope>
<gml:low>0 0</gml:low>
<gml:high>32768 20479</gml:high>
</gml:GridEnvelope>
</gml:limits>
<gml:axisName>x</gml:axisName>
<gml:axisName>y</gml:axisName>
</gml:Grid>
</spatialSubset>
</domainSubset>
<output>
<crs>EPSG:4326</crs>
<format>GeoTIFF</format>
</output>
</GetCoverage>
并且不要忘记将 application/xml 作为内容类型。
干杯!
我在 GeoServer 上有非常大的栅格,例如 35000px X 30000px。(马赛克图像) 我目前正在做的是使用 WMS 下载这些图像,然后对该图像执行分析、修改(我正在为该图像的某些部分着色),然后将其上传回GeoServer 作为新层。
这适用于最大 20000px X 20000px 的图像,但之后 GeoServer 无法合并它们,而不是 geotiff 图像 returns 文件,其中包含 xml 内容:
错误 [geoserver.ows] - java.lang.OutOfMemoryError: Java堆space
现在在 java 选项变量中,我插入 Xmx 为 22 GB 并在 运行 jetty Xmx[=23 的内部脚本中=] 被放置为 20GB。我使用 top 和 free -m 命令密切关注平均负载,使用的内存从未超过 8GB。 我的服务器有 28GB RAM 和 8 个处理器,CPU 负载从未超过 700%。 有人可以提示我做错了什么以及我该怎么做才能下载如此大的 Geotiff 图像。 顺便说一句,我正在使用码头作为服务器。
虽然我没有意识到为什么会出现此错误,但我设法使用 Web 覆盖服务 (WCS) 而不是 WMS 从 GeoServer 下载了整个栅格。 WCS 是下载大光栅图像的正确方法。 因此,如果有人偶然发现类似问题,我建议您像这样向地理服务器上的 wcs 服务发送 post 请求 POSThttp://192.168.4.162:9090/geoserver/wcs 并且随着数据传递 xml 描述您的图层(您可以使用 Geoserver 中的 demos 菜单下的 WCS 请求生成器创建它)。我的看起来像这样:
<?xml version="1.0" encoding="UTF-8"?><GetCoverage version="1.0.0" service="WCS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/wcs" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/wcs http://schemas.opengis.net/wcs/1.0.0/getCoverage.xsd">
<sourceCoverage>fiware:test</sourceCoverage>
<domainSubset>
<spatialSubset>
<gml:Envelope srsName="EPSG:4326">
<gml:pos>-87.3539257 38.3719729154</gml:pos>
<gml:pos>-87.3437449312 38.3783359</gml:pos>
</gml:Envelope>
<gml:Grid dimension="2">
<gml:limits>
<gml:GridEnvelope>
<gml:low>0 0</gml:low>
<gml:high>32768 20479</gml:high>
</gml:GridEnvelope>
</gml:limits>
<gml:axisName>x</gml:axisName>
<gml:axisName>y</gml:axisName>
</gml:Grid>
</spatialSubset>
</domainSubset>
<output>
<crs>EPSG:4326</crs>
<format>GeoTIFF</format>
</output>
</GetCoverage>
并且不要忘记将 application/xml 作为内容类型。 干杯!