Tăng tốc độ bộ đệm của gạch (TileStache)


13

Tôi đang phục vụ gạch vector bằng TileStache , tôi có mọi thứ được thiết lập như tôi muốn. Dữ liệu của tôi được lưu trữ trong Postgres và tôi đang sử dụng nhà cung cấp VecTiles để phục vụ gạch GeoJSON .

Tôi muốn lưu trữ tất cả các ô của mình để làm cho các ô phục vụ nhanh hơn. Tôi đang sử dụng tilestache-seed.py để chọn bộ đệm của mình. Tôi đang chạy tilestache-seed trên một số máy. Tilestache-seed hoạt động rất tốt ở mức zoom zoom 13, nhưng sau đó, nó mất quá nhiều thời gian để lưu trữ các ô. Chỉ với Zoom Level 16, tôi có 5023772 ô để lưu vào bộ đệm và tôi chỉ nhận được các ô 100k-200k mỗi ngày trên mỗi máy.

Làm thế nào tôi có thể làm cho bộ đệm của tôi nhanh hơn ? Có cách nào để tinh chỉnh tilestache-seed.py và làm cho nó nhanh hơn không?

Cập nhật: Tôi đã thử xây dựng các chỉ mục không gian trên các bảng của mình (trên cột hình học và các cột được sử dụng để lọc dữ liệu qua mệnh đề where) và tôi vẫn chưa thấy tốc độ ốp lát tăng đáng kể. Với tốc độ này, chỉ có Zoom 17 sẽ đưa tôi một tháng và lần này sẽ chỉ tăng theo cấp số nhân khi tôi tiến tới Zoom 21

Cập nhật 2: Tôi cũng đã thử thực hiện các chế độ xem cụ thể hóa và không có thay đổi rõ rệt về hiệu suất, vì vậy tối ưu hóa cơ sở dữ liệu không hoạt động. Tôi nghĩ rằng tôi sẽ cần phải tối ưu hóa chính tilestache-seed.py hoặc nghĩ ra một cách mới để lưu trữ các ô.

Thông tin về phần cứng Tôi đang chạy các quy trình lưu trữ trên 8 PC khác nhau, một trong số đó là i7 với ram 32gb và một là i3 với ram 4gb nhưng cả hai đều cho tôi tốc độ bộ nhớ đệm gần như nhau (khoảng 100 nghìn gạch mỗi ngày)

Câu trả lời:


5

Tôi sẽ nói rằng để thu phóng lớn hơn 15, nếu bạn chia khu vực quan tâm của mình thành các khu vực nhỏ hơn (Hộp giới hạn), bạn sẽ có thể lưu trữ chúng trong thời gian ngắn hơn nhiều bằng cách chạy nhiều quy trình trên một máy.

Ví dụ: bạn đang chạy zoom 16 (có 50.000,00 ô) trên máy và theo tốc độ bộ nhớ cache trung bình của bạn, quá trình này sẽ hoàn tất sau khoảng 40-50 ngày. Hãy nói rằng bạn chia các ô này thành hai và chạy chúng đồng thời trên máy thì bạn sẽ có thể lưu trữ chúng trong 20-25 ngày vì quy trình gieo hạt giống chỉ sử dụng khoảng 30 phần trăm bộ xử lý của bạn cho một quy trình lưu trữ bộ đệm đơn và tôi biết điều này bởi vì tôi có cùng một vấn đề một lần và cho đến khi một số vấn đề này đã giải quyết vấn đề của tôi.

Nó sẽ không ảnh hưởng đến tốc độ bộ nhớ đệm nếu bạn đang chạy một tiến trình trên một máy hoặc nhiều tiến trình nhưng việc sử dụng CPU sẽ được tăng lên.

Tôi hy vọng điều này sẽ giúp bạn.


Đó có vẻ là điều tốt nhất để làm cho đến nay, tôi sẽ kiểm tra thử điều này và xem những gì sẽ xảy ra.
Hasan Mustafa

Đây là giải pháp tốt nhất mà tôi đã tìm thấy cho đến nay, mặc dù nó không lý tưởng (tôi muốn hoàn thiện phần mềm tilestache-seed.py) nhưng nó hoạt động đủ tốt.
Hasan Mustafa

2

Theo mặc định, shp2pgsql KHÔNG tạo chỉ mục. Bạn cần phải vượt qua -Iđể làm cho nó tạo ra một chỉ mục không gian. http://postgis.net/docs/manual-1.3/ch04.html#id435762

Kiểm tra xem bảng của bạn có một chỉ mục bằng cách chạy \d tablenametrong psql. Trong danh sách các chỉ mục phải là một dòng có "ý chính" (trừ khi bạn chọn một chỉ mục khác) và tên cột hình học của bạn.

Bạn cũng có thể thêm một cái sau khi thực tế, xem http://postgis.net/docs/manual-1.3/ch03.html#id434676 (đừng để ghi chú về sự mất mát làm bạn sợ):

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

Vì có thể bạn cũng sử dụng các cột không phải không gian trong các truy vấn của mình, nên bạn thường muốn tạo các chỉ mục cho mỗi cột được sử dụng để tra cứu. Ví dụ: nếu bạn có một truy vấn như thế SELECT * FROM roads WHERE priority = 3;thì priorityđược sử dụng và thêm một chỉ mục cho nó sẽ tăng tốc đáng kể mọi thứ:

CREATE INDEX idx_roads_priority ON roads(priority);.


Tôi đã sử dụng trình cắm "PostGIS Shapefile và DBF loader" trong Postgres, nó đã tạo ra một chỉ mục: CREATE INDEX scale_geom_idx ON scale USING gist (geom). , tự động khi tôi nhập shapefiles của tôi. Tôi có nên tìm kiếm để làm thêm chỉ mục?
Hasan Mustafa

Bạn có rất nhiều hàng? Là thế hệ gạch vector của bạn phụ thuộc vào các thuộc tính khác (ví dụ: các phần con của dữ liệu)?
bugmenot123

Có cho cả hai, tôi có rất nhiều hàng trong một số bảng, bảng POI của tôi có khoảng 975k hàng và đường shapefile của tôi là 8,5gb trước khi nhập vào Postgres. Tôi đang sử dụng truy vấn để lọc dữ liệu dựa trên các mức thu phóng: "10": "CHỌN wkb_geometry AS hình học , mức độ ưu tiên, tên, route_num TỪ các đường WHERE ưu tiên IN (5,4,3)" đây là truy vấn tôi đang sử dụng để trả về đường ở mức thu phóng 10.
Hasan Mustafa

Sau đó tạo một chỉ mục trên mỗi cột bạn sử dụng trong mệnh đề WHERE. Bạn cũng có thể tạo các chỉ mục nhiều cột nếu cần.
bugmenot123

Làm thế nào tôi có thể làm điều đó, trên cơ sở nào tôi nên lập chỉ mục?
Hasan Mustafa

1

Một cách khác để thử nếu bạn đang sử dụng truy vấn tiêu chuẩn là tạo chế độ xem được cụ thể hóa từ truy vấn và xây dựng các ô của bạn từ đó: http://www.postgresql.org/docs/9.3/static/sql-createm vật liệuview.html

Điều này sẽ làm là tạo cho bạn một bảng lưu trữ truy vấn (để bạn có thể cập nhật nó trong tương lai). Hãy chắc chắn rằng bạn có các chỉ số không gian trên các MV con và sau đó bạn sẽ nhanh nhất có thể.

Điều có thể xảy ra là bạn có một chỉ mục không gian, nhưng sau đó bạn chỉ chọn một số dữ liệu, điều đó có nghĩa là bạn không sử dụng chỉ mục không gian nữa ...


Tôi có 11 bảng khác nhau mà tôi đang truy vấn để tạo các ô của mình, điều đó có nghĩa là tôi sẽ phải thực hiện 11 chế độ xem cụ thể? Và các truy vấn của tôi cũng thay đổi dựa trên Mức thu phóng.
Hasan Mustafa

Chà, nếu nó không đủ nhanh, có lẽ việc đưa ra các quan điểm về các câu lệnh chọn chậm nhất sẽ có thể cải thiện nó. Lưu ý rằng bạn có thể tạo MV của bất kỳ câu lệnh chọn nào, kể cả từ nhiều bảng nếu bạn cần.
Alex Leith

Vì vậy, nếu tôi thực hiện một MV dựa trên tất cả các truy vấn của mình thì nó có hoạt động không?
Hasan Mustafa

Bạn không thể làm điều đó. Tạo một cho truy vấn chậm nhất của bạn, có thể cho một mức thu phóng duy nhất và xem liệu nó có làm cho tôi nhanh hơn không.
Alex Leith

1
Vâng, nếu đó là trường hợp sau đó tối ưu hóa cơ sở dữ liệu sẽ không giúp đỡ. Nhìn sâu hơn.
Alex Leith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.