项目要求是定时(500毫秒)察看一个1M左右的文件,如果文件出现变更(文件MD5编码发生变动)则判断为文件更新,这时作以下操作:
1.按固定字长读取数据作为一条数据(2进制流),
2.将该条数据格式化成30组双精度数值
3.与预存值做部分运算,并将新数据保存为暂存值;
4.将30组运算后的值格式化成字符串,以标记字母开头,逗号分割,然后写入暂存区(Memcached)
循环由于记录数过多(1500和2000条上下的2个文件)以及更新频率过高(20次/分钟,间隔不定)在循环时会出现cpu长时间100%占用,有没有什么办法能将CPU占用降下去的方案阿,用Thread.sleep(1)是绝对不可以的,所有操作必须要争取在3秒内完成

解决方案 »

  1.   

    使用FileSystemWatcher,它会监视文件修改,有修改会有事件发生的不用自己去读取比较,试试吧
      

  2.   

    首先对于判断文件是否更新的方法,一定要用md5来做吗?用一个md5去算一个2m的文件,呵呵,cpu不耗掉才怪。
    另外对你处理数据的方式,建议你采用一带多的方式,一个线程去读文件,把文件分割成1500-2000条,然后把数据放入一个队列里,然后你另外起到10-15个线程同时对这些数据进行处理,得到结果。
      

  3.   

    FileSystemWatcher 应为会对一次修改引发多次事件(我这边基本上都会在文件修改时出发3次change事件),所以从项目规划阶段就被抛弃了而计算MD5是出于数据方面的考虑,由于这个项目的来源文件时由另外一个程序来写的,而且有时候只是将文件重写下,内部数据并没有变更,所以比起以最后修改时间来判断,用计算文件MD5的方式能够节省一些扫描操作关于多线程,我现在确实是这样做的,2条现成分别对2个源文件进行监视,当发生变生后读取文件后(MemoryStream类型)丢个一条扫描线成来进行单记录的分解;每分解出一条记录(BYTE[])后丢给格式化线程去格式化并保存;所以3层次的线程是单纯的上下关系(不需要返回值交互),总的线程数通过程序线程池来交给西贡管理,现在了最大线程数(500条辅助线程,2000条IO线程)关于IO,由于使用的 Memcached ,数据并不是写入文件,而是写入内存空间中,IO开销已经降低到最低限度实在是想不出还有什么办法能降低IO开销的方法了
      

  4.   


    难怪cpu总是100%了,一个进程里开到500个线程,呵呵,光系统调度线程就已经占掉机器的cpu了。一个进程开到15-20个线程就是最优的了,你可以进程一起来就开辟15-20个线程做while(true),然后指向一个队列,当队列为空时阻塞住,另外一个线程读取文件,往队列里塞数据,塞进去一个数据,就释放一个线程去处理。这种处理模式的效率是最高的。
      

  5.   

    你有1500-2000个数据,每个数据去起一个线程来格式化,最坏的情况就会有2000个线程干活。呵呵,建议你去查下资料,对于线程的分配是一个什么概念。
    一般一个cpu一个进程最合理的线程数是25个,进程本身会占掉5-10个线程左右,所以理想状态是开15-20左右线程就可以了。如果你多cpu,基本上是16-20 * cpu的个数就可以了,开多了反倒没效率。除非你的线程总是会被第三方调用阻塞住,因为这样线程老闲着,没占用cpu,这样你可以算一个最佳的线程数,可以多于这个数。像你的这种情况,基本上开到20个已经不错了。