?
大數據環(huán)境下提高動態(tài)鏈接庫(DLL)的命中效率
楊 海 鷹
(包頭師范學院 物理科學與技術學院,內蒙古 包頭 014030)
摘要:人們對速度的追求沒有止境。計算機從問世那天起,硬件速度、存儲容量一直在快速增加和擴大,保存在計算機中的數據不斷增加并累積,量變引起質變,一個被稱為大數據的時代終于到來,面對可謂爆炸性增長的數據,僅靠提高計算機硬件運作速度難以滿足用戶對“大數據”廣泛深層快速的處理需求,從軟件層面入手,設計合理高效計算機程序,可在不增加硬件成本前提下有效提高系統(tǒng)整體運行效率,不失為事半功倍的措施。遇到巨大量文件數據以及數量可觀且不斷變動的動態(tài)庫(DLL)處理模塊,正是這類措施發(fā)揮作用的情況。
關鍵詞:DLL;注冊表;動態(tài)注冊;被動注冊
1前言
和十年前相比,今天計算機速度顯著提高,容量大幅增加,應用范圍進一步擴大,應用力度加強,同時諸如手機之類智能產品,諸如數碼照相機之類的數碼產品等迅猛普及,隨之而來的是,人們需要計算機處理的數據,無論規(guī)模還是數量都急劇膨脹,數據種類趨于多樣化,這種局面被人們稱之為大數據時代。面對數量巨大種類繁多的數據,無論簡單的檢索還是深層的數據挖掘,僅靠提高計算機速度和加大容量還不夠,提高軟件運行效率依然是重要課題。筆者曾參與了相關項目,該項目可以處理種類繁多數量巨大的數據文件,數據處理模塊可由多人獨立設計不定時完成,并以動態(tài)鏈接庫形式提供,由于項目的性質,動態(tài)庫數量可以很多,有可能超過萬種,甚至更多,項目面臨的問題是:不可能也不應該把眾多的動態(tài)庫同時裝入內存,何況一定時間內,許多動態(tài)庫不可能被用到,解決這些問題,我們將采用動態(tài)注冊,被動注冊等技術,這些技術的核心工作是提高動態(tài)庫命中效率。
2基礎知識
為了敘述方便,我們把每次數據處理稱一個任務(Task),數據處理總量用M表示(可認為是數據文件個數),每個數據處理動態(tài)庫稱模塊(Model),模塊數量用N表示。
計算機數據一般以文件形式保存在外部存儲器當中,現實中,來源各異大批數據文件的保存并無明顯規(guī)律,一些情況下局部范圍里,許多數據文件可能屬同類,當需要處理一個數據文件(也就是數據),系統(tǒng)需要找到至少一個合適的Model,如何盡可能避免遍歷所有Model,以最快的速度找到合適的Model,或者做出沒有合適Model的判斷,這將基于一些基本事實和合理假設,盡管不是完全可靠,多數情況下我們依然可以從文件擴展名獲得文件數據類別信息,處理上一個任務的Model很有可能用于當前Task。一個Model能處理哪些類別的數據是可以預知的,依據這些情況我們可以建立一張表,稱之為注冊表(RegTable),注冊表將Model與文件擴展名、引用計數等對應起來,注冊表的建立可有效提高動態(tài)庫命中效率,同時還有其他用途。
圖1 注冊表、數據、Model與驅動系統(tǒng)關系
注冊表、數據、Model、驅動系統(tǒng)和界面關系如圖1所示。實際應用中,數據總量M可以非常龐大,可達數億、數十億或更多,Model總數N也可以很大。若對每個數據m,簡單遍歷N個Model,這將是最為低效。若對M值很大的數據進行遍歷處理,系統(tǒng)效率可能變得十分緩慢而不可接受。這里有一些途徑可有效提高類似工作的效率。
3注冊表與動態(tài)注冊、被動注冊
注冊表是基于文件擴展名的。用P表示文件擴展名所代表文件真實類別的概率,多數時候,P值在90%以上或更高,但P值經常不能達到100%。數據m多數情況下可有明確的Model識別,而Model n總有機會被使用到。使用注冊表,驅動系統(tǒng)可以在不打開數據文件和無需調用Model的情況下,以很高概率建立數據和相應可識別數據的Model之間的聯系。
外部存儲器中的數據M不斷變化,Model數量N也是不斷變化的,系統(tǒng)對M和N的數值一無所知,一個Model預知擴展名的文件可能無法由該Model處理,而一個Model沒有預知擴展名的文件可能由該Model處理,因此注冊表只能動態(tài)建立,并且必需由系統(tǒng)和Model共同維護。方案如下:每個Model在首次被系統(tǒng)調用(這種調用一般發(fā)生在系統(tǒng)遍歷中)時將相關信息加入注冊表,其中最重要的就是Model名稱和它可以識別的所有文件擴展名,該過程就是主動注冊。當系統(tǒng)向Model傳送的數據可以被識別,而文件擴展名并未注冊在該Model項目下,此時系統(tǒng)可以將這種文件擴展名加入注冊表并和該Model聯系起來,這個過程就是被動注冊。RegTable基本情況見表1。
表1:注冊表
有了注冊表,就可以考慮對于一個任務,系統(tǒng)如何借助它及別的措施提高動態(tài)庫的命中速度,例如按引用計數項目對注冊表排序就可產生很好的效果。順便指出,隨著注冊表不斷使用,動態(tài)庫的命中率會不斷提高,系統(tǒng)運行效率也因此不斷提高。注冊表將動態(tài)建立,動態(tài)注冊使得Model的安裝變得簡單。
4Model的搜索和命中
驅動系統(tǒng)初次運行,注冊表還未建立,系統(tǒng)不可避免需要經歷一個顛簸期。很快注冊表會被建立起來,我們就基于這種狀況介紹系統(tǒng)如何盡力提高動態(tài)庫命中效率。每取得一份數據m,系統(tǒng)首先測試上一份數據使用過的Model是否可以識別現行數據m,若可以,這是最理想的,若不可以,系統(tǒng)將卸載當前Model,而后依據文件擴展名搜索注冊表“注冊文件擴展名”項,如果需要,再搜索“被動注冊文件擴展名”項,正常使用的系統(tǒng)中,這種工作效率很高命中率很大,若命中操作依然沒有成功,系統(tǒng)會遍歷注冊表,依次調用注冊表中所注冊的每一個Model,如果也沒有命中,系統(tǒng)就會采用遍歷保存動態(tài)庫的文件目錄,依次調用所有Model,最后作出數據m是否可以被識別處理的決定。系統(tǒng)使用一段時間后,上述兩種遍歷情況出現概率會不斷降低。
為了讓大家有一個更直觀的了解,下邊提供了實現這些設計的C++程序片斷。
bool bResult;
//1.先測試剛用過的Model
if(PluginMain)
{
PluginMain(PLG_FILETYPE,(void*)(&m_strFullPathName), (void*)(&bResult));
if(bResult)
{
PluginMain(PLG_INIT,(void*)(&m_strFullPathName),(void*)(&initInfo));
UpdateViews(this,MSG_FILESELECTED,(CObject*)(&initInfo));
return;
}
}
//卸載上一個Model
if(m_hInstance)
{
::FreeLibrary(m_hInstance);
m_hInstance=NULL;
PluginMain=NULL;
}
//2.查找注冊表
if(SearchRegTable(m_strFullPathName,initInfo))
{
UpdateViews(this,MSG_FILESELECTED,(CObject*)(&initInfo));
return;
}
//3.注冊表廣播
if(BroadcastToRegTable(m_strFullPathName,initInfo))
{
UpdateViews(this,MSG_FILESELECTED,(CObject*)(&initInfo));
return;
}
//4.Model目錄廣播
if(BroadcastToPlugins(m_strFullPathName,initInfo))
{
UpdateViews(this,MSG_FILESELECTED,(CObject*)(&initInfo));
return;
}
//選擇結束,無可用Model
說明:PluginMain是被調用動態(tài)庫的句柄,PLG_FILETYPE是提請Model完成數據m的識別標記,PLG_INIT是提請Model進行初始化工作的標記。
我們可以對上面程序作必要的數學分析。這里用P′表示數據識別概率,用n表示可以識別的數據份數,用s表示已操作的數據總數(即已操作的文件總數),那么:
用E表示動態(tài)庫命中效率,用t表示時間,則:
一般情況下P′在程序第2步“查找注冊表”命中測試中達到最大值,這種情況所用時間最短,E值也就是命中效率最高。而第3和第4步遍歷操作會使P′減小,所耗時間顯著增加,E值迅速降低,因此可以看出,注冊表的引入對提高動態(tài)庫命中效率有不可低估的作用。
5結語
以上討論針對的是迅速找到可以識別處理數據m的model這種情況,因此無論搜索注冊表,還是遍歷注冊表注冊的動態(tài)庫或遍歷動態(tài)庫目錄,都是以找到第一個可用Model為前提的,事實上,已注冊的Model可能不止一個可以識別數據m,動態(tài)庫目錄的情況也是類似,我們也可以將徹底遍歷作為選項提供給用戶,也就是說,在發(fā)生遍歷的情況下,要用每一個可以識別數據m的Model對數據加以處理,當然,這類事情與我們大數據背景下提高動態(tài)庫命中效率需要相悖,此處不再作進一步探討。不同環(huán)境下的注冊表和動態(tài)庫目錄是可以合并的,一些情況下,這可以成為迅速提高動態(tài)庫命中率的捷徑。
〔參考文獻〕
[1]Bjarne Stroustrup.C++程序設計語言(特別版)[M].北京:機械工業(yè)出版社,2010.
[2]Jeff Prosise.MFC Windows程序設計(第2版)[M].北京:清華大學出版社,2001.
[3]Charles Petzold.Windows程序設計(第5版)[M].北京:北京大學出版社,1999.
Improve the Dynamic Link Library Under the Big Data Environment (DLL) Hit Efficiency
YANG Hai-ying
(Faculty of Physical Science and Technology,Baotou Teachers College,Baotou 014030)
Abstract:People never-ending quest for speed.After the advent of the computer,Hardware speed and storage capacity has been rapidly increasing and expanding,Data stored in the computer continues to increase and accumulate,The quantitative change cause a qualitative change,Big Data era has finally arrived,Faced with the explosive growth of data,Improve the speed of computer hardware alone can not meet the needs of users to handle "big data" extensive deep fast processing needs,Starting from the software level,Design a rational and efficient computer program,Can be provided without additional hardware cost effectively improve the efficiency of the overall system,Is a very effective measure.Faced with a huge amount of file data,And a great number of Dynamic library (DLL) processing module,It is the case that such measures play a role.
Key words:DLL;Registry;Dynamic registration;Passive registration
中圖分類號:TP311
文獻標識碼:A
文章編號:1004-1869(2015)01-0023-03
作者簡介:楊海鷹(1965-),內蒙古包頭人,副教授,研究方向:計算機語言及軟件設計。
收稿日期:2014-10-18