• 大便很“血腥”?这可不一定是痔疮造成的 2019-11-10
  • 重磅岀炉!CDR交易细则来了,没有资产限制,总体与A股一致,首单小米19日上会 2019-11-10
  • (两会受权发布)最高人民检察院检察长简历 2019-11-08
  • 太原网友:建议公交调整河西线路 2019-11-08
  • 近九成券商股逆市上涨 防御+反弹攻守兼备 2019-11-03
  • 青春逐梦向阳之路 平台引擎加速成长 2019-11-02
  • 端午小长假 游人“醉”西湖 2019-11-02
  • 谢谢这位家长,不然这位雨中护送高考生的交警还没有人知道呢 2019-11-01
  • 《汶川十年·我们的故事》一:寻找向日葵 2019-10-25
  • 人民网评:青年有梦想有责任,国家有希望 2019-10-25
  • 西安位居最受欢迎十大旅游城市第四 2019-10-23
  • 人民观影团:《恐袭波士顿》用爱来驱散暴恐阴霾 2019-10-23
  • 挑剔出了名的莱佛士新酒店选址波兰 只为了致敬艺术复兴? 2019-10-12
  • 流溪河森林公园美不胜收 2019-10-09
  • 海鲜排档公然销售违禁海鲜 执法部门责令整改 2019-10-05
  • 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 提交需求 博信网络微信公众号

    博信网络微信公众号

    加微信报价格

    加微信报价格

    19500彩票网网站 www.pngls.tw 输入您的电话,了解详情

  • 留言
  • 我们只做三件事:设计,建站,开发

    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条记载,则当即回来,因为数据现已事前按照证券类型和代码排好序了,所往后边找到的一定没有之前找到的匹配度高,这一改进直接前进了查找查询的功率。对有序的数据进行查找功率一般会比无序的数据查找功率高。我们常见的一些查找算法,比如说,二分查找法,条件也是待查找的集结有序摆放。

    三、选用非保管代码或许??楸嘈词荽χ寐呒?/p>

        上面的两部操作虽然减少了将近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++编写,在.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应用程序内存占用的一点儿实习和总结,希望对您有所帮忙。

     

    相关推荐

    19500彩票网网站

    大象彩票网登录:400-8842-880

    品牌网站设计塑造高颜值公司!

    • 售前:0771-2860265 / 5783282
      13481069551(卢经理)

    • 售后:0771-5783282

    • 工作时间:09:00 - 18:30

    ©2019.ALL RIGHTS RESERVED.南宁博信网络技术有限公司  桂ICP备10201394号  桂公网安备45010302001330号 html网站地图 xml网站地图
  • 大便很“血腥”?这可不一定是痔疮造成的 2019-11-10
  • 重磅岀炉!CDR交易细则来了,没有资产限制,总体与A股一致,首单小米19日上会 2019-11-10
  • (两会受权发布)最高人民检察院检察长简历 2019-11-08
  • 太原网友:建议公交调整河西线路 2019-11-08
  • 近九成券商股逆市上涨 防御+反弹攻守兼备 2019-11-03
  • 青春逐梦向阳之路 平台引擎加速成长 2019-11-02
  • 端午小长假 游人“醉”西湖 2019-11-02
  • 谢谢这位家长,不然这位雨中护送高考生的交警还没有人知道呢 2019-11-01
  • 《汶川十年·我们的故事》一:寻找向日葵 2019-10-25
  • 人民网评:青年有梦想有责任,国家有希望 2019-10-25
  • 西安位居最受欢迎十大旅游城市第四 2019-10-23
  • 人民观影团:《恐袭波士顿》用爱来驱散暴恐阴霾 2019-10-23
  • 挑剔出了名的莱佛士新酒店选址波兰 只为了致敬艺术复兴? 2019-10-12
  • 流溪河森林公园美不胜收 2019-10-09
  • 海鲜排档公然销售违禁海鲜 执法部门责令整改 2019-10-05
  • 怎么买足彩稳赚 福彩快乐12助手 手机购彩最新消息 刺激战场ag俱乐部招人 开心街机捕鱼 什么是骑士赚钱团队 十一选五胆拖投注计算器 麻将馆赚钱 用什么方法压大小稳赢 快乐十分如何买最赚钱