เพิ่มความเร็วในการแคชไทล์ (TileStache)


13

ฉันให้บริการแบบเรียงต่อกันแบบเวกเตอร์โดยใช้TileStacheฉันมีทุกอย่างที่ฉันต้องการ ข้อมูลของฉันถูกเก็บไว้ในPostgresและฉันใช้VecTilesผู้ให้บริการจะให้บริการGeoJSONกระเบื้อง

ฉันต้องการแคชไทล์ทั้งหมดของฉันเพื่อให้ไทล์แสดงเร็วขึ้น ฉันใช้tilestache-seed.pyเพื่อเก็บแคชของฉัน ฉันกำลังเรียกใช้tilestache-seedบนเครื่องหลายเครื่อง Tilestache-seed ทำงานได้ดีมากจนถึงระดับการซูมที่ 13 แต่หลังจากนั้นมันใช้เวลาในการแคชนานเกินไป สำหรับการซูมระดับ 16 ฉันมีไทล์ 5023772 เพื่อแคชและฉันได้รับไทล์ 100k-200k ต่อวันในแต่ละเครื่อง

ฉันจะทำให้ไทล์แคชของฉันเร็วขึ้นได้อย่างไร มีวิธีในการปรับแต่งtilestache-seed.pyและทำให้เมล็ดเร็วขึ้นหรือไม่

อัปเดต:ฉันได้ลองสร้างดัชนีเชิงพื้นที่บนตารางของฉัน (ในคอลัมน์รูปทรงเรขาคณิตและคอลัมน์ที่ใช้สำหรับกรองข้อมูลผ่านส่วนคำสั่ง where) และฉันยังไม่เห็นการเพิ่มความเร็วในการเรียงซ้อนที่สำคัญ ในอัตรานี้มีเพียงการซูม 17 เท่านั้นที่จะใช้เวลาหนึ่งเดือนและครั้งนี้จะเพิ่มขึ้นอย่างทวีคูณเมื่อฉันเลื่อนไปที่ซูม 21

อัปเดต 2:ฉันพยายามสร้างมุมมองที่เป็นรูปธรรมเช่นกันและไม่มีการเปลี่ยนแปลงที่สังเกตได้ดังนั้นการเพิ่มประสิทธิภาพฐานข้อมูลจึงไม่ทำงาน ฉันคิดว่าฉันจะต้องเพิ่มประสิทธิภาพ tilestache-seed.py ด้วยตนเองหรือคิดหาวิธีใหม่ในการแคชไทล์

ข้อมูลฮาร์ดแวร์ฉันใช้กระบวนการแคชกับพีซี 8 เครื่องซึ่งหนึ่งในนั้นคือ i7 ที่มี 32gb ram และ i3 ที่มี 4gb ram แต่พวกเขาทั้งสองให้ความเร็วในการแคชที่เท่ากันเกือบทั้งหมด (ประมาณ 100k แผ่นต่อวัน)

คำตอบ:


5

ฉันจะบอกว่าสำหรับการซูมที่มากกว่า 15 ถ้าคุณแบ่งพื้นที่ที่คุณสนใจออกเป็นพื้นที่เล็ก ๆ (กล่องกระโดด) คุณจะสามารถแคชพวกมันได้ในเวลาที่น้อยลงโดยการใช้กระบวนการหลายกระบวนการในเครื่องเดียว

ตัวอย่างเช่นคุณกำลังเรียกใช้การซูม 16 (มีไพ่ 50,000,00 แผ่น) บนเครื่องและตามความเร็วการเรียงไพ่โดยเฉลี่ยของคุณกระบวนการนี้จะเสร็จสมบูรณ์ในเวลาประมาณ 40-50 วัน ให้บอกว่าคุณแบ่งไพ่เหล่านี้เป็นสองและเรียกใช้พร้อมกันบนเครื่องแล้วคุณจะสามารถแคชได้ใน 20-25 วันเพราะกระบวนการเพาะเมล็ด tilestache ใช้หน่วยประมวลผลของคุณประมาณ 30 เปอร์เซ็นต์สำหรับกระบวนการแคชไทล์เดี่ยวและฉันรู้ สิ่งนี้เพราะฉันมีปัญหาเดียวกันครั้งแล้วครั้งเล่าถึงสิ่งที่ยังหลงเหลืออยู่ซึ่งแก้ไขปัญหาของฉันได้

มันจะไม่ส่งผลต่อความเร็วการเรียงไทล์หากคุณใช้กระบวนการเดียวบนเครื่องหรือกระบวนการหลายกระบวนการ แต่การใช้งาน CPU จะเพิ่มขึ้น

ฉันหวังว่านี่จะช่วยคุณได้


ฟังดูเหมือนสิ่งที่ดีที่สุดที่ฉันจะลองดูและลองดูว่าเกิดอะไรขึ้น
Hasan Mustafa

นี่เป็นทางออกที่ดีที่สุดที่ฉันเคยพบมาแม้ว่าจะไม่เหมาะ (ฉันอยากจะปรับ tilestache-seed.py) ให้ทำงานได้ดีพอ
Hasan Mustafa

2

โดยค่าเริ่มต้น shp2pgsql ไม่ได้สร้างดัชนี คุณต้องผ่าน-Iเพื่อสร้างดัชนีเชิงพื้นที่ http://postgis.net/docs/manual-1.3/ch04.html#id435762

ตรวจสอบว่าตารางของคุณมีดัชนีหรือไม่โดยเรียกใช้เป็น\d tablenamepsql ในรายการดัชนีควรเป็นบรรทัดที่มี "ส่วนสำคัญ" (ยกเว้นกรณีที่คุณเลือกดัชนีอื่น) และชื่อคอลัมน์รูปทรงเรขาคณิตของคุณ

คุณสามารถเพิ่มหนึ่งหลังจากข้อเท็จจริงเช่นกันดูhttp://postgis.net/docs/manual-1.3/ch03.html#id434676 (อย่าปล่อยให้หมายเหตุเกี่ยวกับ lossiness ทำให้ตกใจคุณ):

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

เนื่องจากคุณอาจใช้คอลัมน์ที่ไม่ใช่เชิงพื้นที่ในแบบสอบถามของคุณโดยปกติคุณต้องการสร้างดัชนีสำหรับแต่ละคอลัมน์ที่ใช้ในการค้นหา ตัวอย่างเช่นถ้าคุณมีคำถามเช่นSELECT * FROM roads WHERE priority = 3;นั้นpriorityถูกนำมาใช้และเพิ่มดัชนีสำหรับมันจะเร่งความเร็วสิ่งต่าง ๆ อย่างมีนัยสำคัญ:

CREATE INDEX idx_roads_priority ON roads(priority);.


ฉันใช้ปลั๊กอิน "PostGIS Shapefile และตัวโหลด DBF" ใน Postgres มันสร้างดัชนี: CREATE INDEX scale_geom_idx ON scale โดยใช้ส่วนสำคัญ (geom) โดยอัตโนมัติเมื่อฉันนำเข้ารูปร่างไฟล์ของฉัน ฉันควรทำดัชนีเพิ่มเติมหรือไม่
Hasan Mustafa

คุณมีแถวเยอะไหม? การสร้างไทล์เวกเตอร์ของคุณขึ้นอยู่กับคุณสมบัติอื่น ๆ (เช่นการเลือกย่อยของข้อมูล) หรือไม่?
bugmenot123

ใช่ทั้งสองฉันมีแถวจำนวนมากในบางตารางตารางจุดที่น่าสนใจของฉันมีแถวประมาณ 975k และรูปร่างถนนของฉันคือ 8.5gb ก่อนนำเข้าสู่ Postgres ฉันใช้คิวรีเพื่อกรองข้อมูลตามระดับการซูม: "10": "SELECT wkb_geometry AS เรขาคณิต , ลำดับความสำคัญ, ชื่อ, route_num จากถนนเป็นลำดับความสำคัญใน (5,4,3)" นี่คือแบบสอบถามที่ฉันใช้เพื่อกลับถนน ในระดับการซูม 10
Hasan Mustafa

จากนั้นสร้างดัชนีในแต่ละคอลัมน์ที่คุณใช้ในส่วนคำสั่ง WHERE คุณยังสามารถสร้างดัชนีหลายคอลัมน์ได้หากต้องการ
bugmenot123

ฉันจะไปเกี่ยวกับการทำสิ่งที่ฉันควรทำดัชนีบนพื้นฐาน?
Hasan Mustafa

1

อีกสิ่งที่ควรลองถ้าคุณใช้คิวรีแบบมาตรฐานคือการสร้างมุมมองที่เป็นรูปธรรมจากคิวรีและสร้างไทล์ของคุณจาก: http://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

สิ่งนี้จะทำคือทำให้คุณเป็นตารางที่จัดเก็บแบบสอบถาม (เพื่อให้คุณสามารถอัปเดตได้ในอนาคต) ตรวจสอบให้แน่ใจว่าคุณมีดัชนีเชิงพื้นที่สำหรับ MV เด็กแล้วคุณจะเร็วเท่าที่จะทำได้

สิ่งที่อาจเกิดขึ้นคือคุณมีดัชนีเชิงพื้นที่ แต่จากนั้นคุณกำลังเลือกเฉพาะข้อมูลบางส่วนซึ่งหมายความว่าคุณไม่ได้ใช้ดัชนีเชิงพื้นที่อีกต่อไป ...


ฉันมี 11 ตารางที่แตกต่างกันซึ่งฉันกำลังสอบถามเพื่อสร้างไทล์ของฉันนั่นหมายความว่าฉันต้องทำมุมมองที่เป็นรูปธรรม 11 ครั้งหรือไม่ และข้อความค้นหาของฉันก็เปลี่ยนไปตามระดับการซูมเช่นกัน
Hasan Mustafa

ถ้ามันไม่เร็วพออาจทำให้มุมมองของคำสั่ง select ที่ช้าที่สุดจะสามารถปรับปรุงได้ โปรดทราบว่าคุณสามารถสร้าง MV ของคำสั่งที่เลือกรวมถึงจากหลาย ๆ ตารางหากคุณต้องการ
Alex Leith

ดังนั้นถ้าฉันทำ MV เดียวจากคำค้นหาทั้งหมดของฉันมันจะใช้ได้ไหม
Hasan Mustafa

คุณทำอย่างนั้นไม่ได้ จัดทำหนึ่งรายการสำหรับคิวรีที่ช้าที่สุดของคุณหรือระดับการซูมเดียวและดูว่ามันทำให้ฉันเร็วขึ้นหรือไม่
Alex Leith

1
ถ้าเป็นอย่างนั้นการเพิ่มประสิทธิภาพฐานข้อมูลจะไม่ช่วย มองลึกลงไป
Alex Leith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.