點擊我前往Github查看源代碼 別忘記star
本項目github地址:https://github.com/wangqifan/ZhiHu
第一個大錯誤是沒能及時釋放非托管資源,導致程序運行長的之后拋出OutOfMemoryException.
這個小Demo主要的非托管資源一個是http請求的httpWebresopne和流,另外一個是RedisCline。導致這個問題出現不是我不知道要釋放非托管資源,而是代碼疏忽。這個寫代碼習慣應該是很久了,因為以前程序並沒有運行很久在,這個問題並沒有暴露出來
剛開始時候是這樣寫的
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { return reader.ReadToEnd(); }
之間在using語句里面執行,這樣還沒有釋放對象就返回了
改進:
string Source = string.Empty; … using (Stream stream = response.GetResponseStream())//原始 { using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { Source = reader.ReadToEnd(); } } … return Source;
對待非托管資源,兩個推薦方法
第二大錯誤,將異步等同與多線程
異步不等於多線程
對於I/O密集型應該使用異步,對於CPU密集型用多線程。爬蟲中獲取網絡資源是I/O密集型,而html解析是cpu密集型的。由於爬蟲中非要獲取資源才能解析,我並沒有采用異步
- using語句,執行超出using就會被釋放
- 巧用finallly語句 try{}catch{}不要忘了還有finally 在finally里面顯示調用dispose方法
其實他們編譯結果是一樣的
我踩的第一大坑httpwebrequest默認連個連接,不管開多少線程還是那個速度
需要在app.config里面添加
<system.net> <connectionManagement> <add address="*" maxconnection="100000"></add> </connectionManagement> </system.net>
缺陷:
sqlserver中很多表是1對多關系,由於數據不夠規范導致一對多變成一對一很多數據冗余
數據展示
采用echart,關於echart請看我的博客http://www.cnblogs.com/zuin/p/6122818.html
男女比例
被關注量分布
校友數最多的10個學校
員工最多的10個公司
主修專業人數前10
或贊數最多的top10