9254|29

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CE 6.0内存映射读文件速度慢,急! [复制链接]

先讲讲5.0情况:

5.0内存映射读取文件,会有物理内存进行缓存,这样重复读取相同内容时直接从内存缓冲中取得,直到所有物理内存耗尽(low_memory情况),这时5.0会一次性全部自动释放所有物理内存,之后的文件读取又要从文件去取到内存了。这里的物理内存缓冲是所有物理内存(一般有30几 M)。

而6.0的情况是物理内存内存缓冲默认只有1 M,这样读取大量数据的时候的就会频繁在内存和SD卡之间取数,导致内存映射速度很慢。

各位高人是否有办法改变那默认的1 M缓冲区,能改的话该怎么改。直接由API可调还是能通过注册表修改。我想把那 1M  改成30M。
         先谢过!

最新回复

额。。。我这边正在用Ue32直接查看二进制代码,和 Codewarrior的想法初衷是一样的,因为是FIXUPVAL,所以才想着直接去改 nk.nb0的。不过光改变量还是不行,最后还要改变CRC啊。 正在慢慢实现中 。。。大家祝我成功吧。 ------------ 老兄搞成功一定要来分享分享呀 祝成功 niubility  详情 回复 发表于 2010-3-26 15:47
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没人高人指点吗?,,,讨论也行啊
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
没有做过,只能帮顶了。呵呵。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
再顶顶,大家给提供点思路也好哇
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个缓冲机制由cachefilt.dll实现,它是一个Global的file system filter。
在CE6下,cache最小1M,最大128M,默认32M。
通过注册表System\\StorageManager\\CacheFilt\\CacheVMSize可以修改其大小,这个修改会影响整个文件系统。
个人认为你可以试试在CreateFile的时候指定FILE_FLAG_NO_BUFFERING,如果有此标志,则cachefilt会将此文件作为uncached处理。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢楼上的回帖,
我已经知道原因了,是因为 Wince 有个 Paging pool 机制,具体见:http://msdn.microsoft.com/en-us/library/aa909043.aspx
简单的说就是专门有块内存用来缓冲文件映射的数据,5.0默认不开启该Paging pool 机制,故可以缓冲到所有物理内存,而6.0为了安全性考虑将该缓冲大小默认设为1M,像5.0情况当读取大文件时很容易造成低内存情况(Low-memory),会导致系统不稳定。
基本情况就是这样了,但是现在的问题是貌似只有在定制内核时才能修改该缓冲大小,用户层代码(应用程序)无法修改,哎,买了的 PND都是6.0的,内核都已经烧好了,真是愁死了。不知道哪里有对应的注册表能改的。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼上 定制内核的时候 在哪修改这个缓冲大小?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
看样子有两个pool,你的文件是只读的还是可读写的?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 codewarrior 的回复:
看样子有两个pool,你的文件是只读的还是可读写的?


是有两个Pool,一个是代码pool,一个是普通内存映射 pool,
我的是普通的只读的大文件(一般300M左右)
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 6 楼 sniper167 的回复:
楼上 定制内核的时候 在哪修改这个缓冲大小?


BIB里能改,
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

11
 
在用户层代码本来可以通过 KernelIoControl() 来修改的,但是6.0为了还是为了增加安全性只有极少数的IOCTL_HAL_XXX 类型能在用户层调用成功,对 IOCTL_HAL_GET_POOL_PARAMETERS (就是用来改Paging pool 大小的)的调用肯定返回False.  哎,这下是寡妇死儿子---没指望了。不过驱动层的调用可以的,(6.0把驱动拿到内核去了,原来的device.exe变成了内核进程的一个device.Dll了)。

现在我在想能不能通过什么方法让内核模式来调用我的代码,这样就能调成功KernelIoControl()函数了。有没有什么系统回调之类的函数啊?
望高手指路。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
呵呵还需要OEM提供了IOCTL_HAL_GET_POOL_PARAMETERS才行,否则call这个IOCTL是没用的。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
If the OAL does not implement this IOCTL, the kernel chooses suitable default settings.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 9 楼 maomoa2 的回复:
引用 6 楼 sniper167 的回复:
楼上 定制内核的时候 在哪修改这个缓冲大小?


BIB里能改,

BSP的config.bib中。这几个变量是FIXUPVAR。
例如:
    kernel.dll:LoaderPoolTarget       00000000  01000000  FIXUPVAR ;Paging Pool Target Size
    kernel.dll:LoaderPoolMaximum      00000000  02000000  FIXUPVAR ;Paging Pool Maximum Size
    kernel.dll:FilePoolTarget         00000000  00C00000  FIXUPVAR ;File Pool Target Size
    kernel.dll:FilePoolMaximum        00000000  01000000  FIXUPVAR ;File Pool Maximum Size
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 11 楼 codewarrior 的回复:
呵呵还需要OEM提供了IOCTL_HAL_GET_POOL_PARAMETERS才行,否则call这个IOCTL是没用的。


恩,是的。。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

16
 
上面说的那几个变量都是在代码中有默认值,可以被bib文件给改写掉。如果OEM没有指定,那么默认值是写死在代码里的:
LoaderPoolTarget, 3M
LoaderPoolMaximum,8M
FilePoolTarget,1M
FilePoolMaximum,10M
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

17
 
看来在内核已经固定死的情况下,只能将最后一线希望交给注册表了,看看注册表里面是否有相关的注册值能改的。

哎。。。我们在 CE6.0 上开发了个应用程序,光数据库就有好几百M,目前用内存映射来读取文件,原先的5.0根本不会有问题的,可是现在6.0上就不行了,由于那个缓冲小的原因,所以读数据很慢,已经到了卡的程度了。 现在貌似无头苍蝇一个。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 15 楼 codewarrior 的回复:
上面说的那几个变量都是在代码中有默认值,可以被bib文件给改写掉。如果OEM没有指定,那么默认值是写死在代码里的:
LoaderPoolTarget, 3M
LoaderPoolMaximum,8M
FilePoolTarget,1M
FilePoolMaximum,10M


恩,应该是这样的,这样的话,就几乎没有办法了。555
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

19
 
学习了。。。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

20
 
MARK~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表