快乐扑克三开奖查询|山东体彩快乐扑克开奖走势图

Hi,Are you ready?

準備好開始了嗎?
那就與我們取得聯系吧

有一個互聯網項目想和我們談談嗎?您可以填寫右邊的表格,讓我們了解您的項目需求,這是一個良好的開始,我們將會盡快與你取得聯系。讓慧眼獨具的您!享受我們專業的互聯網產品和服務!

BOXSIN NETWORK 博信網絡設計整合

業務熱線:0771-2860265 / 5783282(固話)
400-8842-880(全國熱線)

不打烊專線:13481069551 (盧經理)

E-mail:[email protected]

合作意向表

您需要的服務

現有網站改版
我需要做微信營銷
建設全新的企業網站
要找長期合作公司,需要年度服務
我需要做購物商城
我需要做系統平臺
我需要做小程序

您最關注的地方

對功能要求比較高
對設計創意要求比較高
需要可以購物支付
搜索引擎排名

預算

2萬內 2-5萬 5-10萬 10萬以上 大型項目需要招標
  • 看不清楚,換個圖片

業務QQ 0771/2860265 提交需求 博信網絡微信公眾號

博信網絡微信公眾號

加微信報價格

加微信報價格

輸入您的電話,了解詳情

  • 留言
  • 我們只做三件事:設計,建站,開發

    2013
    03.18

    點擊

    NET應用程序內存占用的一則實踐

    來源: 本站   責任編輯:博信網絡   字體大小:    

        比來一周比較忙,首要的作業內容是在做一個叫“鍵盤精靈”的東西,簡略來講就是將許多數據放到內存中,對這些數據進行快速檢索,然后找出根據輸入條件最匹配的10條記載并予以展示。具體和下面兩款炒股軟件的相關功用類似:

    減少.NET應用程序內存占用的一則實習

        數據以文本方法存在文件中,且數據量較大,有近20萬條,每一條記載有幾個字段,以分隔符切開。當時運用的是6萬條記載的檢驗數據,文本文件將近10M,這個模塊加載到內存并建立緩存之后,大概會占用將近70-80M的內存。自我接手往后,首要的任務就是降低內存消耗和前進匹配功率。

    一、防止創建不必要的政策

    拿到代碼后,第一步就是看描寫文檔,然后斷點一步一步的看代碼,大概理解了邏輯之后,發現思路有一些疑問。之前的代碼處置流程思路大概是下面這樣的:

    1.將文件讀取到內存,實例化

    2.根據條件對文件進行檢索,并存儲到效果集1中

    3.對效果集1中的效果進行匹配度核算,并存儲到效果會合2

    4.按對效果集2進行匹配度排序,取最匹配的10條記載,然后回來

        這個進程中規中矩。可是其中有許多疑問,最大的疑問是,暫時變量存儲了太多的中間處置效果,而這些政策在一次查詢結束后又馬上扔掉,許多的暫時政策帶來了很大的GC壓力。舉例來說,當用戶在輸入框中輸入1的時分,假定運用Contains來匹配,那么從6萬條記載中找出包括1的記載可以有4萬多條,然后需要把這4萬多條記載存儲在暫時變量中進行處置,進一步核算這4萬條記載的匹配度,然后存儲到一個類似KeyValuePair的調會集,key為匹配度,然后對這個集結按Key進行排序,然后取前10條最優記載。可以看到,中間創建了許多的暫時變量,使得內存劇增,許多暫時政策創建之后馬上會被回收,GC壓力山大。

    而在描寫文檔中,只需要回來最最匹配的10條記載,之前的處置方案中如同并沒有注重到這一點。所以接手后,第一步就是對上面的處置進程進行精簡。精簡后如下:

    將文件讀取到內存,實例化

    根據條件對文件進行檢索,如果存在,則:

    核算匹配度。

    以匹配度為Key,存儲到只需11個容量的SortList中。

    如果SortList集結添加記載后大于10個,則移除結尾面一個元素,一貫保持著前10個最小(匹配度最優)的記載。

    遍歷結束之后,回來這個集結政策

        經過這一批改,減少了許多暫時數據對內存的占用,整個進程中,我只是運用一個容量為11的SortList規劃存儲中間的進程,每一次刺進一個元素,SortList幫我們排好序,然后移除最不匹配的那一個,也就是結尾一個元素(從小到大排序,越匹配,值越小)。這里面的消耗首要是SortList的刺進,內部排序和移除記載。 說到這里在選擇SortList仍是SortDictionary的疑問上糾結了一下,所以又找了些資料,SortDictionary在內部運用紅黑樹完結,SortList選用有序數組完結, 在內部排序都為O(logn)的條件下,SortDictionary的O(logn)刺進及刪去元素的時辰雜亂度優于SortList,可是SortDictionary會比SortList占用更多內存。底子來說這是一個查詢速度和內存分配之間的平衡,因為這里只需要存儲11個政策,所以兩者相差不大。其實即使沒有這種規劃,自己也可以完結的,無非就是一個集結,每次添加一個,排好序,然后將最大的那個移除。.NET運用起來便利是因為有許多這些健壯的內置數據規劃。

    減少.NET應用程序內存占用的一則實習

    經過上面這個小小的批改,內存占用一瞬間降低了1倍,從正本的70-80M,降低到了30-40M,其實這就是降低內存開支的一個最底子的原則,那就是防止創建不必要的政策。

    二、優化數據類型及算法

        越到后邊內存的降低越來越困難。仔細看了代碼之后,除了上面之外,代碼中也有一些其他疑問,比如,一初步就將許多的政策實例化到內存中,然后一貫保管。每一條記載中的信息比較多,但實在有用的用于查找匹配的只需下面四個字段,可是整體的實例化會將其他沒有用的字段也一起序列化進去了。致使許多內存被無用的字段占用。

    “證券代碼 證券中文名 中文拼音 商場類型 ……

    600000 浦發銀行 PFYH 上證A股 ……”

    所以第一步就是在內存中只存放需要檢索的上面四個要害字段,每一條記載剛初步是運用string[]數據,而不是運用類或許其它規劃來保管,也檢驗運用規劃提來保管,可是因為四個字段,數據量大,中間還要作為參數傳遞,所以比運用類還大,這里只是簡略的運用了數組。

        除了上面這些之外,為了前進查找功率,對數據按照0-9,a-z開始對數據做了切分分塊緩存,這樣當用戶輸入0時,直接從以0為key的塊中讀取數據,這樣速度是加快了,可是許多的緩存也添加了對內存的消耗。緩存的數據底子上和加載到內存中原始的數據一樣大了。并且在查找的進程中,也是選用的完全查找,關于17萬條數據的四個字段,每一次查詢要進行170000*4次遍歷比較,才華找出最匹配的10條數據來。

    為此,引入了不完全查找,就是事前對各類型證券,如 證券,基金,債券分類,對每一類按證券代碼進行排序。當用戶設置了查找的優先級時,依次在每一類中查找,如果找到滿足條件的10條記載,則當即回來,因為數據現已事前按照證券類型和代碼排好序了,所往后邊找到的一定沒有之前找到的匹配度高,這一改進直接前進了查找查詢的功率。對有序的數據進行查找功率一般會比無序的數據查找功率高。我們常見的一些查找算法,比如說,二分查找法,條件也是待查找的集結有序擺放。

    三、選用非保管代碼或許模塊編寫數據處置邏輯

        上面的兩部操作雖然減少了將近50-60%的內存占用,可是仍然達不到領導的需要,所以又檢驗并比較了各種 運用不一樣的數據規劃將數據載入到內存中的內存占用大小,包括直接將文件按類型讀成字符串、數組、規劃及類,內存占用最小的直接將文件讀成字符串,10M的數據文件讀進內存也會占用20-30M的空間,還不談對其進行處置進程中發作的一些暫時變量對內存的占用。運用dotTrace及CLR Profile等東西檢查之后,發現內存的占用也是這些原始數據。然后以” How to reduce the memory usage of .NET applications” 到網上搜了一下減少.NET內存占用的一些方法,在StackOverflow上看到了這一答復:

    減少.NET應用程序內存占用的一則實習

        該同學指出.NET應用程序和其他運用本地代碼編寫的程序比較會有較大的內存占用,如果對內存開支比較介懷,.NET可以不是最佳的選擇。.NET應用程序的內存一定程度上受廢物回收的影響。并指出,一些數據規劃如List,系統會分配剩下的空間。可以運用值類型而不是引用類型,不要創建大政策,防止發作內存碎片等等降低內存占用的建議。

        這些都思考過之后,內存仍是達不到需要,所以初步尋找調用非保管代碼的方法來自己更活絡的控制內存的分配與銷毀。可是整個程序都是選用.NET編寫的,全部切換成C或許C++不現實,所以只需兩種方案,一是運用unsafe 代碼,二是將數據加載和檢索模塊選用C或許C++編寫,在.NET中選用P/Invoke技術調用。

        剛初步想選用unsafe代碼,對數據的加載及檢索直接在放在unsafe 代碼中。后來覺得代碼有些亂,不一樣特性的代碼稠濁在一起不太好,并且數據加載和檢索的邏輯也比較雜亂。所以就直接選用第二種方案,運用C++編寫數據加載和檢索邏輯。然后在.NET里面調用。

    在初步之前,也做了一些評估,比如將一樣的10M的數據加載到內存中,都選用字符串的方法存儲,.NET中會占用20-30M的內存,而在C++中只需9-10M的姿勢,并且改變很小。這正是需要的效果。

        因為對C++不熟,暫時抱佛腳,翻了下C++ Primier Plus中關于字符串和STL的相關章節,并請求其他開發小組給予了一定的幫助,定義了底子的接口。為了演示,我創建了兩個工程,一個是名為SecuData的C++ Win32 DLL工程,一個是檢驗該類庫的名為SecuDataTest的C# WinForm程序。

    我在C++中定義好了4個方法,一個初始化加載數據,一個設置查找優先級,一個查找匹配方法和一個卸載數據方法,具體的算法因為作業緣由不方便貼出,這里只是舉一個簡略的比如,方法名及工程規劃如下圖:

    減少.NET應用程序內存占用的一則實習

    然后再在.NET中運用P/Invoke技術引入C++ DLL中定義的方法。

    減少.NET應用程序內存占用的一則實習

        這樣就可以在.NET中調用這些方法了,需要說明的是,方法的傳入值這里是運用String類型的,第二個StringBuilder類型的參數是方法的實在回來值,方法的整體int型回來值標明方法能否實行成功。在調用查找方法時,第二個StringBuilder參數有必要初始化一個最大的查詢效果的大小,因為在C++中會往這個政策中寫入效果,不初始化或許初始化太小都會拋出失常。當然也可以直接回來規劃體,這個就需要額外定義,這里回來的都是字符串。完了自己在.NET里面對其進行解析。

        需要注重的是,調試的時分,如果需要調試C++里面的代碼,需要指定DLL的生成目錄及發起政策,并且將C++項目設置為發起項目,這里我設定生成DLL的目錄為SecuDataTest項目生成的SecuDataTest.exe文件地址的目錄,調試發起政策設置為SecuDataTest.exe,這樣在C++項目中設置斷點,發起.NET Winform程序,當P/Invoke觸發斷點時可以逐步調試C++代碼。

    在發布的時分,最佳將默許的動態庫配備批改為靜態庫,這樣VS會把依托的相關C++庫打包到生成的dll中,安置到客戶機器上不會呈現疑問。SecuData類庫項目的特色設置如下圖:

    減少.NET應用程序內存占用的一則實習

    改成這種P/Invoke方式之后,10M數據載到內存中,內存占用只需10M左右,較之前選用.NET的30-40M的內存又降低了許多,并且內存不堅定比較小,滿足了對內存占用的需要。

        選用這種“混搭”方法有一些長處,既有.NET的快速開發,又有C++的活絡的內存分配銷毀方式以及代碼安全性保護。在許多時分,可以將一些對內存占用比較活絡,大數據量的處置邏輯,放在C++中處置,運用活絡的手動內存處理方式降低這有些的內存占用;將中間的數據規劃及算法運用C++編寫,可以前進代碼的安全性,前進程序的反編譯難度。

    四、結語

         NET應用程序因為需要加載CLR及一些通用類庫,并且具有廢物收集機制,較其他本地言語如C,C++具有較大的footprint,運用.NET創建一個簡略的Winform可以就會占用近10M的內存,所以跟著開發的進行,內存占用會比較大。當然這些在許多時分是因為開發者自身對.NET底層機制不熟悉,比如在有些當地可以運用值類型而運用引用類型;創建了許多的暫時的周期比較短的政策;運用了過多的靜態變量及成員致使內存被耐久占用而得不到回收;以及.NET內部的一些機制,比如集結政策會在內部預先分配剩下的空間等等。許多時分因為有.NET的GC機制,使得我們不必去注重政策的銷毀而很”大方”的去創建新政策,去運用一些重型的內置政策,然后致使內存占用過大。處置好這些疑問,其實可以降低.NET應用程序的適當大一有些的不必要的內存占用。

        除了曉得.NET規劃的一些內部機制之外,出色的思路,高效數據規劃和算法也可以使得疑問變得簡略而減少內存的開支。

    結尾關于對內存需要比較活絡,可以運用C/C++的手動的活絡的內存處理言語來編寫相應模塊,在.NET中選用P/Invoke技術進行調用來減少一些內存。

    以上是我對降低.NET應用程序內存占用的一點兒實習和總結,希望對您有所幫忙。

     

    相關推薦

    400-8842-880

    品牌網站設計塑造高顏值公司!

    • 售前:0771-2860265 / 5783282
      13481069551(盧經理)

    • 售后:0771-5783282

    • 工作時間:09:00 - 18:30

    ©2019.ALL RIGHTS RESERVED.南寧博信網絡技術有限公司  桂ICP備10201394號  桂公網安備45010302001330號 html網站地圖 xml網站地圖
    快乐扑克三开奖查询