现在想改进读写磁盘的效率。
   
   #define MAX_SIZE   0x10000 //64K  
   UCHAR  WriteBuf{MAX_SIZE];
   
   如果1G的文件,每次只读64K,1G/64K = 16*1024 次
                 每次读个64M,1G/64M = 16   不知道Buffer最大可以申请多少,或者说多大才合适?

解决方案 »

  1.   


    如果是用数组那么空间是按栈的大小来分的,进程给每个函数分配1M内存,理论说你如果在函数内只定义char[]数组,那么最多可以分1M。
    如果是new出来的,系统为每个进程分配2G的空间(我没记错的话是这个数),理论上说你的进程什么也不干,那么能分出小于2G来。
      

  2.   

    Win32是2GB。最大3GB。参见《Windows核心编程》
      

  3.   

    用内存映射文件,把1G的文件全部映射进去,呵呵,这要看你的CPU效率了,做512M应该是没问题的
      

  4.   

    [url=http://topic.csdn.net/u/20080716/23/8393ebb4-4187-4601-b66f-69e9ea74d39b.html]
      

  5.   

    虽然理论上能分配到2G,开启3G模式后可以达到3G,但实际并不能申请到这么多的空间。
      

  6.   

    正解。所以要把握好这个度才能发挥最好效率。 由于虚拟技术,当硬盘被你当做内存使用,而你又不知道,那你的算法就会大大的减慢硬盘的读写,甚至远不如正常速度。 
    一般硬盘都有一定的缓存,比如8M。那么你的内存缓存建议 4*8MB,或许这么大都不用,2*8MB就好了。
      

  7.   

    学习,没有触碰过WINDOW下对进程和线程内存的限制,不过你如果只是为了提高对大文件的读写效率,用内存映射文件的方式就可以了。
      

  8.   

    就是要将大个ISO文件写入到逐个扇区移动硬盘上,结合函数栈大小,硬盘的缓存大小及程序的稳定性。决定选择1M 吧.
      

  9.   


    应该是小于1M,LZ不要那么可丁可毛儿啊!
      

  10.   

    几十K地分配显然是太小了,VC6的时候有一个WriteHuge函数专门处理大块的读写,后来微软把它去掉了,因为不和规范。但是Read,Wirte仍然可以处理大块的内存,这个由操作系统来操心就可以了。但是太大了也不行,虽然理论上可以2G,但是连续分配一个2G大块的内存是不可能的。根据我自己试验的结果,一次申请256M的内存在绝大部分计算机上都是可行的。用内存映射文件更好一些。
      

  11.   

    各位高手请为小弟指点下,我用VC++6.0 写程序,就申请了1.2M空间,用该数组坐标访问特定的值是总报:Unhandled exception in newTrack2Program.exe:0xC0000005:Access Violation
    程序代码:
    typedef struct InvertIndex
    {
    int ID;
    struct InvertIndex* next;
    }* PinvertIndex;PinvertIndex* invertIndex=new PinvertIndex[300000];//共动态申请1.2M空间int main()
    {
         if(invertIndex!=NULL)
         {
             invertIndex[250000]->ID=100;
         }
         return 0;
    }