1. 程式人生 > >談操作記憶體malloc,memset對程式時間的影響

談操作記憶體malloc,memset對程式時間的影響

背景

這兩天在看postgis在分散式資料庫的使用,由於postgis的外掛的sql檔案內部包含了自定義表及向表中插入資料的insert操作。

由於現在postgre-xc上create extension 邏輯:

現在本地coordinator上執行完該sql檔案; 

再在各個datanode及其他coordinator上執行。

由於在coordinator上執行insert 語句會將insert語句下發(如果時本地表則不用下發到datanode上),因此避免insert 語句下發(下發會報錯,因為此時datanode上尚未執行sql檔案,對應的表還未建立), 需要將sql檔案建立表按本地表建立(\dS+ tablename)。

修改postres-xc檔案,將create extension涉及的表處理改為本地表(stmt->distributeby為NULL則建立的表是本地表)。

但是在測試過程發現create extension postgis 執行過程中消耗的記憶體不太合理,每執行1行insert操作(共5k多行)就會消耗5MB記憶體左右,通過除錯execute_sql_string 函式,發現pg_analyze_and_rewrite 函式涉及佔用記憶體,發現主要有關Query結構體的變數sql_statement 會申請記憶體,由於postgresql這樣的資料庫使用記憶體上下文方式進行記憶體管理,應該是執行命令create extension postgis結束時統一釋放,避免記憶體洩漏,但是這種每執行一行就申請sql語句大小的記憶體並不是好的處理方式:

1.如果sql過大,則每次佔用的記憶體很多,雖然最後會統一釋放,但是如果insert 行數過多,則可能引起OOM。

 2.記憶體的申請根據個人理解是較佔用時間的(相對於執行add, mov這樣的,應該是這樣命令執行時間的好幾個數量級)。

個人現在通過在合適的時間加上釋放該sql_statement佔用記憶體的方式,使佔用的記憶體總量不會太大,自測postgis-2.4.5已可以執行,相比之前的執行時間(雖然之前會失敗,至失敗時執行時間75s),現在這種執行時間時間變少了(現在總共25s)。

不過比較好的方式是修改Query結構體,通過指標位置及涉及語句長度這樣的變數來定位要執行的語句(現在的sql_statement內容是sql檔案的多個sql的字串), xl 用的這種,時間約5s。

對申請記憶體佔用時間的分析

之前在水木上看到過討論一段程式碼到底是哪些操作會較大影響程式時間,記得主要是記憶體的申請及memset,個人準備研究下為什麼會產生影響,以及有無優化的方法。

後續待補。