文字並行
按體積大致分段,而不是按行數精確分段,目的是提高分段效能。比如在ide中觀察a2或a3的前幾個字段,可以看到行數並非精確的100萬(與具體資料有關):
分段讀取可應用於多執行緒計算,從而提高讀取效能。比如用2個執行緒分別讀取cardinfo.txt,各執行緒計算本段行數,最後合併為總行數,可用如下**:
語句fork語句適合演算法較複雜的情況,當演算法比較簡單時,可用cursor@m直接分段讀取。比如前面的**可以改寫如下:
上述**指定了執行緒數,如果省略執行緒數,則用配置檔案中的「parallet limit」當做預設執行緒數。假設parallet limit=2,則上述**可以改寫成:
為了驗證分段讀取前後的效能差異,下面設計乙個演算法,分別用單執行緒和2執行緒計算cardinfo.txt的總行數,可以看到效能顯著提公升:
jdbc 並行
通過jdbc取數時,有時會遇到資料庫負載雖然不重,但取數效能仍然較差的情況,這種情況下可以用並行取數提高效能。
比如oracle資料庫有一張聯絡歷史表callrecord,記錄數100萬條,索引欄位是calltime,且資料基本按該字段平均分布。採用非並行取數時,可以發現效能不夠理想,**如下:
改為2執行緒並行取數後,可以看到效能提公升明顯,**如下:
既然要並行取數,就要把源資料分成多個區間,使每區間的資料量大致相等。在這個例子中,索引欄位是時間型別calltime,所以先用a7求出calltime的資料範圍,再用a8將該範圍平均分成2個時間區間。之後在a9進行平行計算,每個執行緒以各自的時間區間為引數執行sql,取數結果將大致相等。最後合併多執行緒的取數結果,作為最終結果。
函式range非常適合對資料分段。該函式可將某範圍平均分為n個區間,獲得第i個區間,且可根據範圍的資料型別自動調整區間的資料型別。本例的範圍型別是datetime,則函式range將範圍按秒均分,返回型別也是datetime。如果範圍型別是date,則函式range按天均分;如果範圍型別是整數,則函式range按整數均分。
上面例子中,分段欄位是索引,如果沒有建立索引,則查詢效能會出現下降。在這種情況下,並行取數仍然可以帶來明顯的效能提公升,所以可以用相同的方法。
上面例子中,源資料基本按calltime平均分布,因此容易使各區間的資料量大致相等,如果源資料分布很不平均,可以考慮按行號分段。每種資料庫都有生成行號的方法,比如oralce可用rownum。
除了單表單sql並行取數,spl也支援多表多sql並行取數。比如某報**式較複雜,需要spl執行多個sql,並按一定的格式拼出結果集。當採用非並行取數時,可以發現效能不夠理想,**如下:
改為4執行緒並行取數後,可以看到效能提公升明顯,**如下:
需要注意的是,並行取數時任務數可大於並行數。比如上面**共8個任務,但同時執行的任務只有4個,其他待執行的任務排在佇列中,如果某個小任務先執行完成,spl會從佇列中取下乙個任務並執行它。可以看到,當任務數較多時,即使各任務負載相差較大,也能充分發揮硬體效能。
混合並行
當資料量太大時,除了分庫計算,還可以進行混合資料來源平行計算,後者效能更高。具體做法是:把資料分為兩部分(或多部分),一部分儲存在資料庫中,通常是當前實時資料,一部分儲存在組檔案,通常是歷史資料,再對兩種資料來源進行平行計算,從而獲得更高效能。
比如歷史訂單儲存在orders.ctx中,當前訂單儲存在資料庫orcl中,請按年、月分組,對各組資料的amount欄位求和。spl**如下:
注意fork……fork……的用法。如果fork語句塊下接非fork語句塊,則兩者順序執行,如果fork語句塊下接fork語句塊,則兩者並行執行。
Python Django 取url的一部分
在views.py中獲取urls.py中的正規表示式中的乙個引數 中的可變的匹配引數 在urls中給引數加上分組,在views中獲取引數 urls.py url r article d d view.aaa d匹配數字 匹配個數 外面套上小括號成為分組 views.py def aaa reques...
一部分的技術實現和坑
最近上班一段時間了,準備記錄一下自己的工作上遇到的坑和一些開發的小技術,開始的話是在sina上面更新,覺得逼格不夠啊。來這裡吧 總計大概 1.uibutton組的選中與反選 2.uiscorllview與uibutton組的關聯,實現滑動改變上方button選中狀態。3.childviewcontr...
ros中一部分命令的作用與用法
roscd ros中的roscd命令實現利用包的名字直接切換到相應的檔案目錄下 roslaunch而roslaunch採用xml的格式對需要執行的節點進行描述,可以同時執行多個節點。rosrun rosrun是執行乙個單獨節點的命令,如果要執行多個節點,則需要使用多次rosrun命令。rostopi...