增加图块缓存速度(TileStache)


13

我正在使用TileStache提供矢量图块,我已经按照需要设置了所有内容。我的数据存储在Postgres中,并且我正在使用VecTiles提供程序来提供GeoJSON切片。

我想缓存所有图块,以使图块的投放速度更快。我正在使用tiletache-seed.py播种我的缓存。我正在多台机器上运行tiletache种子。Tilestache-seed的13级缩放效果非常好,但是在那之后花费太长时间来缓存图块。仅对于16级缩放,我要缓存5023772个图块,而每台机器每天只能得到10万至20万个图块。

如何使我的图块缓存更快?有没有一种方法可以微调tilestache-seed.py并使它更快地播种?

更新:我曾尝试在表上(在几何列和用于通过where子句过滤数据的列上)建立空间索引,但我仍然没有看到平铺速度的显着提高。以这种速度,只有Zoom 17会占用我一个月的时间,而随着我朝Zoom 21的方向移动,这一次只会成倍增加

更新2:我也尝试制作实例化视图,并且性能没有明显变化,因此优化数据库无法正常工作。我想我将需要优化tiletache-seed.py本身,或者设计一种新的方式来缓存图块。

硬件信息我正在8台不同的PC上运行缓存过程,其中一台是具有32GB内存的i7,另一台是具有4GB内存的i3,但是它们都为我提供了几乎相同的缓存速度(每天大约100k磁贴)

Answers:


5

我想说的是,对于大于15的缩放,如果将感兴趣的区域划分为较小的区域(边界框),则可以通过在一台计算机上运行多个进程来以更少的时间缓存它们。

例如,您正在计算机上运行zoom 16(具有50,000,00个图块),并且根据平均图块缓存速度,此过程将在40到50天内完成。假设您将这些磁贴一分为二,然后在计算机上同时运行它们,那么您将能够在20-25天之内将其缓存,因为tiletache播种过程仅将您处理器的30%用于单个磁贴缓存过程,我知道这是因为我一次遇到相同的问题,并且在某种程度上解决了我的问题。

如果在计算机上运行单个进程或在多个进程上运行,则不会影响切片缓存的速度,但是会增加CPU使用率。

我希望这能帮到您。


听起来这是到目前为止最好的事情,我将检查尝试一下,看看会发生什么。
哈桑·穆斯塔法

这是到目前为止我发现的最好的解决方案,尽管它不是理想的(我想微调一下tilestache-seed.py),但是效果很好。
哈桑·穆斯塔法

2

默认情况下,shp2pgsql不创建索引。您需要通过-I使其生成空间索引。http://postgis.net/docs/manual-1.3/ch04.html#id435762

通过\d tablename在psql中运行,检查表是否具有索引。在索引列表中应有一行“要点”(除非您选择了其他索引)和几何列名称。

您也可以在事实之后添加一个,请参见http://postgis.net/docs/manual-1.3/ch03.html#id434676(不要让有关损失的注释吓到您):

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometrycolumn] );

由于您可能还会在查询中使用非空间列,因此通常需要为用于查找的每个列创建索引。例如,如果您有一个类似于SELECT * FROM roads WHERE priority = 3;then 的查询priority,并为其添加索引将大大加快处理速度:

CREATE INDEX idx_roads_priority ON roads(priority);


我在Postgres中使用了插件“ PostGIS Shapefile和DBF加载程序”,它创建了一个索引:CREATE INDEX scale_geom_idx使用gist(geom)缩放比例。,当我导入shapefile时自动进行。我应该寻找其他索引吗?
哈桑·穆斯塔法

你有很多行吗?您的向量图块生成是否取决于其他属性(例如,数据的子选择)?
bugmenot123 '16

两者都可以,在某些表中有很多行,我的POI表大约有975k行,在导入Postgres之前,我的roads shapefile为8.5gb。我正在使用查询来基于缩放级别过滤数据:“ 10”:“ SELECT wkb_geometry AS 几何,优先级,名称,route_num来自道路,优先级为IN(5,4,3)”这是我用来返回道路的查询上变焦水平10
哈桑·穆斯塔法

然后在WHERE子句中使用的每个列上创建索引。如果需要,您还可以创建多列索引。
bugmenot123 '16

我应该如何做,应该在什么基础上建立索引?
哈桑·穆斯塔法

1

如果您正在使用标准查询,则要尝试的另一件事是从查询中创建一个物化视图,并从中创建切片:http : //www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

这将使您成为一个存储查询的表(以便将来有可能对其进行更新)。确保您在子MV上有空间索引,然后您将尽可能快。

可能发生的情况是您有一个空间索引,但是随后您只选择了一些数据,这意味着您不再使用空间索引了。


我要查询11个不同的表格来制作我的图块,这是否意味着我必须制作11个实例化视图?我的查询也会根据“缩放级别”进行更改。
哈桑·穆斯塔法

好吧,如果它不够快,也许查看最慢的select语句将能够改善它。请注意,您可以对任何select语句进行MV操作,包括在需要时从多个表中进行操作。
Alex Leith

因此,如果我根据我的所有查询进行一次MV处理,那会起作用吗?
哈桑·穆斯塔法

你不能那样做。为您最慢的查询(可能是单个缩放级别)查询一个,然后查看它是否使我更快。
亚历克斯·莱斯

1
好吧,如果是这种情况,那么优化数据库将无济于事。看得更深
Alex Leith
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.