Record for Individual Project ( Word frequency program )

Hello_Jane發表於2014-09-18

1.  預計時間

  ● 對問題總體的理解、規劃:10 min

  ● 設計編寫程式:5 h

  ● 除錯: 分模組-40 min; 總體-40min

  ● 測試(效能分析)、改進:1 h

 

2.  實際用時

  ● 對問題總體的理解、規劃:10 min

    總的理解了一下題意,打算用C#寫。程式資料結構不復雜,沒有打算用OOP。

  ● 設計編寫程式:

    i) 模式判斷:讀引數,確定是哪種模式(普通、e2、e3)。

      這部分比較簡單。10min左右完成。

    ii) 讀出所有子檔案:採用遞迴的方法。

      這部分查了一下C#檔案方面的類和介面的用法。40min左右完成。

    iii) 分詞:把檔案的單詞劃分出來。

      這部分比較坎坷。在做simple mode的時候,學習了一下正規表示式的書寫,完成大約用了1h 10min。先做了Simple mode的統計詞頻,然後再做extend mode的時候,原本是以為只需要選擇不同的正規表示式即可,然而C#的正則的Matches方法是非重疊匹配,在做2詞、3詞連續時匹配就不適用了。後來重寫了2詞、3詞連續時分詞的方法,但是邏輯有點繁瑣複雜,限於時間湊合用了。算上查正則的時間,可能用了2.5h吧。

    ix) 詞頻統計:統計某個詞(片語)出現的頻率。

      這部分用的方法也有點蠢,因為在統計時不敏感大小寫,但是輸出時要考慮原有的ACII值排序,所以比較麻煩,用的方式是先對分詞的結果(一個ArrayList)進行自帶的Sort排序。這樣得到的結果是字典序,大寫在後。然後再遍歷ArrayList,記錄前一個單詞,對比當前的單詞。因為相同的單詞都是相鄰的,所以可以進行比較、處理。最後得到一個Dictionary記錄單詞與出現頻率。

    x) 排序輸出:(統計出現頻率最高的片語)按ASCII值排序並輸出到檔案。

      這部分也是意想不到的挑戰。之前以為按值排序應該蠻簡單的,但是加上ASCII值的要求又麻煩了一些。還去學寫了IComparer,不過後來發現用StringComparer.Ordinal就可以了。雖然花了意外的時間,但是也有很大的收穫。

  ● 除錯:

    我的習慣是寫完一個模組就會做一些基本的測試。所以除錯的時間比較零碎了。估計總計在2h左右。

  ● 測試(效能分析)、改進:

    這裡最大的坑是我的效能分析工具。因為電腦上空間不太足,又已經有安裝VS2010,去查了一下2010也有效能分析的功能,就打算就用2010了。誰知最後一天做分析時,自己的2010不知道為何一分析就崩潰。下載2013後結果空間不足不能安裝,又用分割槽工具搗鼓了下。但是安裝時間太長,眼看著就要到deadline……於是接了同學的電腦,他的VS2010能用分析,讓我妥妥地淚奔了。但是時間實在太短,沒來及做很多改進了,主要是分析。這個裝工具的時間就不知道該怎麼算了……工作了估計不到2h。

 

3.  效能分析

  這是我作死的大坑……

  來看“大資料”的處理吧:包含2.27G的資料夾,主要是找的一些程式安裝的資料夾什麼的。

  

  CPU的使用率不理想啊……然後匯出到excel函式獨佔率:

  

  看來WordFren,也就是詞頻統計佔了大頭,ReadWord,也就是分詞也不少。後面分析兩詞、三詞的結果也是類似,就先不放上來了。

  不過呢我也沒想到優化這裡的比較好的方面(主要沒時間了)。

  後面有機會再補充吧。

 

4.  測試用例

  1)空資料夾

    輸出為空,沒問題。

  2)巢狀資料夾

    這也是最基本的了,沒問題。

  3)【單】詞模式

    測試了輸出格式,“3個英文字元打頭”等要求,出現頻率,及按ASCII排序輸出。

  4)【雙】詞模式

    類似,並測試了“僅一個空格間隔”的要求。

  5)【三】詞模式

    類似。

  6) 迷惑的單詞模式

    輸入含File、file的檔案,測試輸出時能夠按ASCII值選擇名字。

  7) 迷惑的雙詞、三詞模式

    輸入類似file File File file FILE的文字,測試是否正確統計重複輸出。

  8) 豐富的字尾

    測試了除txt外的格式檔案。

  9) 壓力測試-1

    測試了大約1M的檔案。

  10)壓力測試-2

    測試了大約2.27G的檔案。(效能分析中的分析組)

 

5.  感想

  現在也在忐忑,到底程式還有沒有bug。0 point 還是有點嚇人的。一個很大的教訓是過於放心自己,開始的太晚了。以致最後工具出現問題,導致對效能的改進沒有時間了。

  從這個專案也收穫了很多,一是更熟悉了C#,二是學習了正規表示式,三是學到了效能分析這個功能。

  當然!最後的程式自己還是很不滿意的,因為不算漂亮,這也是限於時間的原因,查C#類和介面的資料也佔了很多時間。

  總之,希望下一次自己能做得更好。

 

相關文章