Meningkatkan Kecepatan Caching Ubin (TileStache)

13

Saya melayani ubin vektor menggunakan TileStache , saya sudah mengatur semuanya seperti yang saya inginkan. Data saya disimpan di Postgres dan saya menggunakan penyedia VecTiles untuk melayani ubin GeoJSON .

Saya ingin membuat cache semua ubin saya untuk membuat ubin melayani lebih cepat. Saya menggunakan tilestache-seed.py untuk seed cache saya. Saya menjalankan tilestache-seed pada beberapa mesin. Benih Tilestache bekerja dengan sangat baik hingga tingkat zoom 13, tetapi setelah itu terlalu lama untuk men-cache ubin. Hanya untuk Tingkat Zoom 16 Saya memiliki cache 5023772, dan saya hanya mendapatkan ubin 100rb-200rb per hari di setiap mesin.

Bagaimana saya bisa membuat ubin saya cache lebih cepat ? Apakah ada cara untuk menyempurnakan tilestache-seed.py dan membuatnya lebih cepat?

Pembaruan: Saya telah mencoba membuat indeks spasial di atas meja saya (pada kolom geometri dan kolom yang digunakan untuk menyaring data melalui klausa where) dan saya masih belum melihat peningkatan signifikan dalam kecepatan ubin. Pada tingkat ini hanya Zoom 17 yang akan membawa saya sebulan dan kali ini hanya akan meningkat secara eksponensial ketika saya bergerak menuju Zoom 21

Pembaruan 2: Saya mencoba membuat pandangan terwujud juga dan tidak ada perubahan yang terlihat dalam kinerja, jadi mengoptimalkan database tidak berfungsi. Saya pikir saya perlu mengoptimalkan tilestache-seed.py itu sendiri, atau menemukan cara baru untuk men-cache ubin.

Info Perangkat Keras Saya sedang menjalankan proses caching pada 8 PC yang berbeda, salah satunya adalah i7 dengan ram 32GB dan yang lain adalah i3 dengan ram 4GB tetapi keduanya memberi saya kecepatan caching yang hampir sama (sekitar 100rb per hari)

Hasan Mustafa
sumber

Jawaban:

5

Saya akan mengatakan bahwa untuk zoom lebih besar dari 15, jika Anda membagi area yang Anda minati menjadi area yang lebih kecil (Bounding box), Anda akan dapat men-cache mereka dalam waktu yang jauh lebih sedikit dengan menjalankan banyak proses pada satu mesin.

Misalnya, Anda menjalankan zoom 16 (memiliki 50.000,00 ubin) pada mesin dan sesuai dengan kecepatan cache ubin rata-rata, proses ini akan selesai dalam sekitar 40-50 hari. Katakanlah Anda membagi ubin ini menjadi dua dan menjalankannya secara bersamaan pada mesin maka Anda akan dapat men-cache mereka dalam 20-25 hari karena proses penyemaian tilestache hanya menggunakan sekitar 30 persen dari prosesor Anda untuk proses caching ubin tunggal dan saya tahu ini karena saya memiliki masalah yang sama sekali dan hingga beberapa yang masih ada ini menyelesaikan masalah saya.

Ini tidak akan mempengaruhi kecepatan caching ubin jika Anda menjalankan satu proses pada mesin atau beberapa proses tetapi penggunaan CPU akan meningkat.

Saya harap ini akan membantu Anda.

Shahzad Bacha
sumber
Itu kedengarannya seperti hal terbaik untuk dilakukan sejauh ini, saya akan memeriksa coba ini dan lihat apa yang terjadi.
Hasan Mustafa
Ini adalah solusi terbaik yang saya temukan sejauh ini, meskipun itu tidak ideal (saya ingin finetune tilestache-seed.py) itu berfungsi cukup baik.
Hasan Mustafa
2

Secara default shp2pgsql TIDAK membuat indeks. Anda harus lulus -Iuntuk membuatnya menghasilkan indeks spasial. http://postgis.net/docs/manual-1.3/ch04.html#id435762

Periksa apakah tabel Anda memiliki indeks dengan menjalankan \d tablenamedalam psql. Dalam daftar indeks haruslah garis dengan "inti" (kecuali Anda memilih indeks yang berbeda) dan nama kolom geometri Anda.

Anda dapat menambahkan satu setelah fakta juga, lihat http://postgis.net/docs/manual-1.3/ch03.html#id434676 (jangan biarkan catatan tentang lossiness membuat Anda takut):

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

Karena Anda mungkin juga menggunakan kolom non-spasial dalam kueri, Anda biasanya ingin membuat indeks untuk setiap kolom yang digunakan untuk pencarian. Jika misalnya Anda memiliki permintaan seperti SELECT * FROM roads WHERE priority = 3;maka prioritydigunakan dan menambahkan indeks untuk itu akan secara signifikan mempercepat hal-hal:

CREATE INDEX idx_roads_priority ON roads(priority);.

bugmenot123
sumber
Saya menggunakan plug-in "PostGIS Shapefile dan DBF loader" di Postgres, itu membuat indeks: CREATE INDEX scale_geom_idx ON skala MENGGUNAKAN inti (geom). , secara otomatis ketika saya mengimpor shapefile saya. Haruskah saya mencari untuk membuat indeks tambahan?
Hasan Mustafa
Apakah Anda memiliki banyak baris? Apakah pembuatan ubin vektor Anda bergantung pada atribut lain (mis. Subseleksi data)?
bugmenot123
Ya untuk keduanya, saya memiliki banyak baris di beberapa tabel, tabel POI saya memiliki sekitar 975rb baris dan shapefile jalan saya 8.5gb sebelum mengimpor ke Postgres. Saya menggunakan kueri untuk memfilter data berdasarkan tingkat zoom: "10": "SELECT wkb_geometry SEBAGAI geometri , prioritas, nama, route_num DARI jalan-jalan WHERE priority IN (5,4,3)" ini adalah permintaan yang saya gunakan untuk mengembalikan jalan pada tingkat zoom 10.
Hasan Mustafa
Kemudian buat indeks pada setiap kolom yang Anda gunakan dalam klausa WHERE. Anda juga dapat membuat indeks multi-kolom jika perlu.
bugmenot123
Bagaimana saya bisa melakukan itu, atas dasar apa saya harus membuat indeks?
Hasan Mustafa
1

Hal lain untuk dicoba jika Anda menggunakan kueri standar adalah membuat tampilan terwujud dari kueri, dan membangun ubin Anda dari itu: http://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

Apa yang akan dilakukan adalah membuat Anda tabel yang menyimpan kueri (sehingga Anda berpotensi memperbaruinya di masa mendatang). Pastikan Anda memiliki indeks spasial pada MV anak dan kemudian Anda akan secepat mungkin.

Apa yang mungkin terjadi adalah Anda memiliki indeks spasial, tetapi kemudian Anda hanya memilih beberapa data, yang berarti Anda tidak lagi menggunakan indeks spasial ...

Alex Leith
sumber
Saya memiliki 11 tabel berbeda yang saya minta untuk membuat ubin saya, apakah itu berarti saya harus membuat 11 tampilan terwujud? Dan pertanyaan saya berubah berdasarkan Tingkat Zoom juga.
Hasan Mustafa
Nah, jika itu tidak cukup cepat, mungkin membuat tampilan pernyataan pilih paling lambat akan dapat memperbaikinya. Perhatikan bahwa Anda dapat membuat MV dari pernyataan pilih apa pun, termasuk dari beberapa tabel jika perlu.
Alex Leith
Jadi jika saya membuat MV tunggal berdasarkan semua pertanyaan saya apakah itu akan berhasil?
Hasan Mustafa
Kamu tidak bisa melakukan itu Buat satu untuk kueri paling lambat, mungkin untuk satu tingkat zoom, dan lihat apakah itu membuat saya lebih cepat.
Alex Leith
1
Nah jika itu yang terjadi maka mengoptimalkan database tidak akan membantu. Lihatlah lebih dalam.
Alex Leith