必赢亚洲手机app下载


实打实的用户

Android入门笔记766net必赢亚洲手机版

内存映射文件

     
第一章:源起** **

     
遭遇一个题材,假设一个客户数据文件有2g大,客户要经过界面查询文件中的数据并用列表控件呈现数据,要怎么处理那一个文件才能让应用程序不会长日子无响应,客户觉得不到程序的卡顿?

 
    第二章:**解决之道**

     
第一反应是用内存映射文件处理大文件,将文件分为多次映射至内存地址空间,避免五次性缓冲整个文件带来的界面长日子无响应,并将暂时不要的内存映射文件打消映射,客户是用列表控件进行体现,这就足以在第一次加载的时候只加载第一页的始末就举行体现,之后在缓冲下一页的内容,当用户查看中间页面的情节时得以缓冲将方今页面的内外页面和首页、最终页面对应的公文加载至进度地址空间中,其余的文件映射视图废除映射。

 
    进一步周密成立二十三十六线程处理,主线程创制文件映射内核对象,多个子线程分别映射磁盘文件的一局地至进程地址空间并举办数量解析,处理完数据的线程通过SendMessage恐怕PostMessage又或许锁、关键段、内核线程同步方式等通报界面线程,而界面线程再做一些NOT
WAIT操作,添加多少个进程条指示首页加载进度和一体化文件加载进程,首页加载成功时隐藏进程条并展现数据。

     
第三章:正文

     
3A:内存映射文件介绍:

 
    创立内存映射文件也就是先调拨一块地点空间区域,然后给区域调拨物理存储器。差别之处在于内存映射文件的大体存储器来自于磁盘上的文本,而不是从系统的页互换文件中分配的。 

 
    3B:**内存映射文件根本用来以下二种意况:**

     
1.系统选择内存映射文件来载入并运行.exe和动态链接库(.dll)文件,能够节约页交流文件的上空和应用程序启动的时间。

     
2.开发人士能够用内存映射文件来拜会磁盘上的数据文件,使得大家得以避免直接对文件进行IO操作和对文件内容开展缓存。

     
3.透过内存映射文件,大家得以在同样台机器的不比进程之间共享数据,windows也提供了别样一些措施来在进程间传送数据,但这几个办法都以由此内存映射文件包装而成,因而最快的相同台机械上的经过间共享数据方式就是内存映射文件。 

      3C:常用API

766net必赢亚洲手机版,      CreateFile:打开文件根本对象

      CreateFileMapping:创设一个指定名称的文书映射内核查象,通过参数指定映射到进度地址空间的公文句柄。

      OpenFileMapping:打开一个指定名称的公文映射内核查象。

      MapViewOfFile:把文件数量映射到进度地址空间,通过参数指定映射到进度地址空间的文书映射句柄和文书访问形式。

      FlushViewOfFile:处于速度上的设想,系统会对文本数量的页面举行缓存处理,这样在拍卖文件映射视图时就不须要每一日更新磁盘上的文本,调用FlushViewOfFile将文件映象的改动立刻从高速缓存写入磁盘映象。

   
 对内存映射文件的拍卖接近读取到内存中的文书,或许了然成操作一串字符串。

      UnMapViewOfFile:完毕文件数量映象的放走。

      CloseHandle,关闭文件映射内核对象,关闭文件根本对象,要调用一遍。 

    3D:注意事项:

   
可以对同一个文件创建八个内存映射文件,但系统并不保险两个内存映射文件之间的多寡一致性,系统只保险同一个内存映射文件的多个视图数据一致。

   
用作内存映射文件的磁盘文件最好是只读属性,可以防止任何进度对文本修改二导致的映射文件和磁盘文件的差别,即使无法认同文件是只读的,那么在创立文件对象的CreateFile时指定访问权限为垄断。

   
不应有用内存映射文件来跨互连网共享可写文件,系统不大概明白网络上别的一台电脑对文本的操作而继续采用内存中的本来面目数据。

   
内存映射文件不肯定须求磁盘文件,也能够创制以页沟通文件为后备存储器的内存映射文件。与创立以磁盘文件为大体存储器的内存映射文件差距的步骤是:不需CreateFile步骤,在CreateFileMapping时文件根本对象传参INVALID_HANDLE_VALUE,那就报告系统物理存储设备从页互换文件分配而不是磁盘文件。 

    第四章:补充话题:

   
4A:稀疏调拨的内存映射文件

   
在此之前的内存映射文件恐怕从磁盘上的数据文件中划拨,要么从页沟通文件中划拨,这象征对存储器的应用或然并不如大家希望的那么高效。根据jeffrey大神的例子,有一个电子表格文件定义:

         CELLDATA CellData[200][256];若是CELLDATA的深浅是128字节,那么那个数组就需求6553600字节的物理存储器,那也就表示程序伊始运行就须要从页互换文件中分配多量的情理存储器,不过用户一般只用前边多少个单元格存放音讯,绝大多数的单元格都是浪费的。

         大家盼望把电子表格作为文件映射对象来共享,但又不想一始发就分配这么大的情理存储器,不过利用文件分片映射视图的法子编程会很麻烦,此时大家得以利用稀疏文件映射格局。

         稀疏调拨的内存映射文件措施:

         CreateFileMapping的fdwProtect参数中指定SEC_RESERVE或SEC_COMMIT,那七个标志只有在以页交换文件为后备存储器来创立文件映射对象时才有含义,SEC_COMMIT标志让CreateFileMapping从页沟通文件中划拨存储器。

         即便在调用CreateFileMapping的时候传出SEC_RESERVE标志,那么系统不会从页交流文件中划拨屋里存储器,它只回去文件映射对象的句柄。

         MapViewOfFile给指定的文件映射对象成立一个视图,即预订一块地点空间区域,但不会给该区域调拨任何物理存储器,此时做客该区域的操作都是地下的。

         调用VirtualAlloc给共享区域调拨物理存储器,大家得以只调拨部分存储器给MapViewOfFile预约的地方空间区域,调拨物理存储器后所有映射了同一个文本映射对象的的视图的别样进度就足以成功的拜会已调拨的页面。

        PS:稀疏调拨的内存映射文件并未实例证实过,诸君谨慎参考。 

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图