文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
1. 背景
項目中有1000萬條歷史案卷,為某地方坐標系數據,我們的真實需求是將地方坐標系坐標反轉成WGS84坐標,如果現在需要將其轉換成百度坐標系數據。常規方案是先建立好整個該市的本地坐標和百度坐標之間的控制點庫后再進行轉換。但是在具體實施中發現轉換特別慢,由於控制點庫也有200多萬條記錄,大概一個點需要一秒鍾才能轉換完。
2.將Update變成Insert關鍵字段值的優化——優化1
最開始采用的是坐標轉換完后,直接update歷史案卷表。由於update的效率是相對低的,尤其是有一千萬條記錄時,即使對主鍵也做了索引,依然效率不高。這里便采用新建一張空表再insert的方案。同時考慮到不必要的字段太多,數據量太大,所以只將歷史案卷的主鍵和坐標insert到新表中的方案進行優化。大概一個坐標轉完可以是0.9秒左右,有一定提高,但不是特別明顯。
3進行分表的優化——優化2
原始算法的轉換步驟是:先從歷史案卷表中獲取一條記錄,再根據記錄坐標去控制點庫獲取該坐標對應的四角坐標的坐標值,然后再根據算法轉換。
最明顯的瓶頸將出現在:
a.從歷史案卷中獲取坐標的時間。
b.從控制點庫中獲取到兩條記錄(左上角控制點對,右下角控制點對)的時間。
可以想象,每次遍歷完整控制點庫是最消耗效率的地方。所以這里將采用對控制點庫進行分庫的優化方法。具體思路為,將控制點庫按照每隔2萬米,分割成一個獨立的表。當坐標進行轉換時,首先算出坐標落在哪個控制點表中,然后查詢該表進行轉換。

現在測試將控制點庫分成了16個表,效率提高到一秒鍾可以轉換5個點,大概也就是0.2秒轉換一個。可以預見如果分更多表效率將更大的提高。不過考慮到避免數據太過碎片化不利於管理。這里將再進行分區的優化嘗試。
4.進行分區的優化——優化3
Mysql中提供了Range、List、Hash、Key四種分區方法,這里由於是地理坐標范圍,所以采用Range來進行分區。目前將進行每5000M的范圍做一個分區。

改完后效率變成了一秒可以轉換20個左右坐標。
5.再次優化插入數據——優化4
由於待轉換數據太多,導致插入數據在進入幾十萬條后明顯變慢。並且之前是轉換完一條就立馬插入,這也導致數據庫操作頻繁,效率下降。
所以這里改成:
a.批量插入,即以事物形式一次插入千條數據。
b.分表插入,當插入滿50萬條后,則創建新的表,繼續插入。
這次修改后,效率又提高不少,大概到每秒轉換30多個點。
6.代碼級別優化,開啟多線程——優化5
啟用多線程進行轉換,目前開啟四個線程。轉換效率可以達到每秒100個左右。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

