




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
作業(yè)報告學(xué)生姓名:學(xué)號:指導(dǎo)教師:學(xué)生E-mail:一、作業(yè)名稱:英文統(tǒng)計詞頻程序的實現(xiàn)二、作業(yè)要求以英文文章為例,利用執(zhí)行體程序庫實現(xiàn)一個多進(jìn)程詞頻統(tǒng)計的程序。對于給定的多個目錄,并發(fā)地統(tǒng)計每個目錄下的所有文件(假設(shè)每個文件中只有英文字符)中單詞出現(xiàn)的次數(shù),并最終匯總出在給定目錄下所有文件中單詞出現(xiàn)次數(shù),然后記錄下來。該過程要求采用多線程協(xié)作方式。三、設(shè)計與實現(xiàn)1、設(shè)計思路首先分析程序設(shè)計的需求,要對多個目錄下的文件進(jìn)行詞頻統(tǒng)計,如果只用一個進(jìn)程順序的對各個目錄下各個文件進(jìn)行計算,會消耗很大時間,另外也無法充分發(fā)揮執(zhí)行體程序庫的優(yōu)勢。而且要求采用多線程協(xié)作方式,這樣很自然的會想到創(chuàng)建一些進(jìn)程去各個目錄下進(jìn)行統(tǒng)計,最后用一個進(jìn)程統(tǒng)一管理這些進(jìn)程,那么父進(jìn)程和子進(jìn)程的思想就出來了。這個過程中,我們是將一個任務(wù)劃分成了多個任務(wù)并行地去執(zhí)行,最后把這些子任務(wù)的執(zhí)行結(jié)果匯總起來就是整個任務(wù)的結(jié)果,其實這就是Map-Reduce思想——把整個任務(wù)執(zhí)行過程劃分為映射(Map)和化簡(Reduce)兩個階段。在詞頻統(tǒng)計程序設(shè)計中,這兩個階段具體工作劃分如下:1、映射(Map)階段:①.主進(jìn)程根據(jù)輸入的目錄數(shù)量創(chuàng)建多個子進(jìn)程,每個子進(jìn)程處理一個目錄;②.子進(jìn)程獲得目錄名后,遍歷整個目錄,統(tǒng)計該目錄下的每個文件的單詞詞頻,作為中間結(jié)果保存。③.子進(jìn)程統(tǒng)計結(jié)束后把中間結(jié)果發(fā)送給主進(jìn)程。2、化簡(Reduce)階段:①.父進(jìn)程接收子進(jìn)程發(fā)送過來的中間結(jié)果,并進(jìn)行匯總;②.子進(jìn)程發(fā)送結(jié)束后父進(jìn)程向其發(fā)送退出消息,子進(jìn)程接收到后退出;③.父進(jìn)程檢查所有子進(jìn)程是否全部退出,若是,則工作結(jié)束,父進(jìn)程退出,否則父進(jìn)程繼續(xù)等待所有子進(jìn)程結(jié)束。圖3-1協(xié)議設(shè)計圖3-1顯示了主進(jìn)程與子進(jìn)程之間的消息協(xié)議,其消息通信流程也比較清楚。2、詞頻統(tǒng)計程序的實現(xiàn)代碼清單3.2.1classCLFatherInitMsg:publicCLMessage{public: CLFatherInitMsg():CLMessage(FATHER_INIT_MESSAGE_ID){}public: stringdirname};消息由消息頭部、消息標(biāo)志ID和數(shù)據(jù)組成。代碼清單3.2.1給出了CLFatherInitMsg的聲明,該類繼承了CLMessage類。其中包含一個string類型的dirname變量,用來存放消息中攜帶的目錄名。此消息是由父進(jìn)程發(fā)送給子進(jìn)程的初始化消息,該目錄名即為子進(jìn)程要進(jìn)行單詞統(tǒng)計的目錄名。代碼清單3.2.2intmain(intargc,char**argv){…… try { if(!CLLibExecutiveInitializer::Initialize().IsSuccess()) { cout<<"Initializeerror"<<endl; return0; } CLFatherWordCountObserver*pFatherWordCountObserver=newCLFatherWordCountObserver; for(inti=1;i<argc;i++) pFatherWordCountObserver->PushDirname(argv[i]); pFatherWordCountObserver->Init(); CLNonThreadForMsgLoopfather_nonthread(pFatherWordCountObserver,"father_pipe",EXECUTIVE_BETWEEN_PROCESS_USE_PIPE_QUEUE); father_nonthread.RegisterDeserializer(CHILD_INIT_MESSAGE_ID,newCLChildInitMsgDeserializer);father_nonthread.RegisterDeserializer(CHILD_SEND_REQUEST_MESSAGE_ID,newCLChildSendRequestMsgDeserializer); father_nonthread.RegisterDeserializer(INTERMEDIATE_RESULT_MESSAGE_ID,newCLIntermediateResultMsgDeserializer); father_nonthread.RegisterDeserializer(CHILD_WORK_FINISH_MESSAGE_ID,newCLChildWorkFinishMsgDeserializer); father_nonthread.Run(0); throwCLStatus(0,0); } ……}代碼清單3.2.2顯示了主進(jìn)程的main函數(shù),描述了主進(jìn)程的執(zhí)行過程。首先實例化一個FatherWordCountObserver類的對象,并進(jìn)行初始化操作。接著創(chuàng)建主進(jìn)程的消息循環(huán)過程,該函數(shù)的傳入?yún)?shù)分別是:FahterWordCountObserver類指針,消息循環(huán)過程的名稱以及消息循環(huán)的方式。其中消息通信方式為進(jìn)程間的管道通信。代碼清單3.2.3intmain(intargc,char*argv[]){if(argc!=2) { cout<<"usage:./a.outchildname"<<endl; exit(-1); } try { if(!CLLibExecutiveInitializer::Initialize().IsSuccess()) { cout<<"Initializeerror"<<endl; return0; }CLNonThreadForMsgLoopchild_nonthread(newCLChildWordCountObserver(argv[1]),argv[1],EXECUTIVE_BETWEEN_PROCESS_USE_PIPE_QUEUE); child_nonthread.RegisterDeserializer(FATHER_INIT_MESSAGE_ID,newCLFatherInitMsgDeserializer);child_nonthread.RegisterDeserializer(FATHER_ACK_MESSAGE_ID,newCLFatherAckMsgDeserializer); child_nonthread.RegisterDeserializer(QUIT_MESSAGE_ID,newCLQuitMsgDeserializer); child_nonthread.Run(0); throwCLStatus(0,0); } catch(CLStatus&s) { if(!CLLibExecutiveInitializer::Destroy().IsSuccess()) cout<<"Destroyerror"<<endl; return0; }}代碼清單3.2.3是子進(jìn)程的main函數(shù),描述了子進(jìn)程的執(zhí)行過程。分別將FATHER_INIT_MESSAGE_ID、FATHER_ACK_MESSAGE_ID、QUIT_MESSAGE_ID這三種消息ID的反序列化類注冊到消息循環(huán)過程中。四、測試根據(jù)前面工作,利用執(zhí)行體程序庫實現(xiàn)了詞頻統(tǒng)計程序,下面我們先穿件兩個待遍歷的目錄testdir_1和testdir_2,每個目錄中都有兩個文件(只有英文字符)。輸入如圖4-1所示的命令創(chuàng)建主線程,攜帶兩個目錄的目錄名,此時主線程等待。圖4-1創(chuàng)建主進(jìn)程在另一個終端創(chuàng)建一個子進(jìn)程ch1,此時主線程與子線程之間通信如圖4-2所示:圖4-2主進(jìn)程與子進(jìn)程ch1可以看出,此時主進(jìn)程和子進(jìn)程ch1已經(jīng)完成通信流程,ch1收到退出消息,而主線程并未退出,因為需要一個子進(jìn)程完成對另個目錄的處理,所以在等待第二個進(jìn)程的結(jié)束。創(chuàng)建子進(jìn)程ch2,處理第二目錄下文件的詞頻統(tǒng)計,此時主進(jìn)程與該子進(jìn)程的通信如圖4-3所示??梢钥吹剑舆M(jìn)程ch2完成操作后,主進(jìn)程發(fā)出退出消息,子進(jìn)程ch2接收退出消息后結(jié)束,同
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32/T 3597-2019增材制造金屬材料機(jī)械性能測試方法指南
- DB31/T 534-2011通信網(wǎng)絡(luò)運營環(huán)節(jié)的節(jié)能要求
- DB31/T 1282-2021車用氣瓶氫氣充裝安全技術(shù)條件
- DB31/T 1184-2019特種設(shè)備隱患分類分級導(dǎo)則
- DB31/ 842-2014微電子元件制造業(yè)職業(yè)病危害控制規(guī)范
- DB31/ 731-2020船舶修正總噸單位產(chǎn)品能源消耗限額
- DB31/ 565-2013中小學(xué)課業(yè)簿冊安全衛(wèi)生與質(zhì)量要求
- DB31/ 48-2012啤酒單位產(chǎn)品能源消耗限額
- 金屬制品在工業(yè)中的智能制造資源優(yōu)化策略設(shè)計優(yōu)化考核試卷
- 初三中考前80天動員會上校長發(fā)言只有化緊張為動力變悔恨為拼搏讓刻苦的學(xué)習(xí)把消極的情緒徹底淹沒你才有可能笑對中考
- 駕駛員心理疏導(dǎo)培訓(xùn)
- 2024-2030年中國汽車輪轂單元市場運行態(tài)勢及未來需求預(yù)測分析研究報告
- PDCA提高便秘患者腸鏡檢查腸道準(zhǔn)備合格率
- 2024年安徽省高考物理+化學(xué)+生物試卷(真題+答案)
- GB/T 23132-2024電動剃須刀
- DL∕T 2553-2022 電力接地系統(tǒng)土壤電阻率、接地阻抗和地表電位測量技術(shù)導(dǎo)則
- 高考部編版高中語文72篇理解性默寫(含答案)
- 外研版英語六年級下冊-M8U1
- 污水泵站運行維護(hù)合同范本
- 2023-2024學(xué)年上海市嘉定區(qū)七年級(下)期末數(shù)學(xué)試卷(含答案)
- DL-T997-2020燃煤電廠石灰石-石膏濕法脫硫廢水水質(zhì)控制指標(biāo)
評論
0/150
提交評論