我看了一下,TMemorStream.locadfromfile实际上也是用TFileStream做的。
现在我创建一个MemoryStream,然后load一个很大的文件,内存中不会出现这个文件的一个拷贝吧?
这个时候是不是应该只有一个文件在硬盘上的地址呀,等到用的时候实际去读的是硬盘而不是内存呀?

解决方案 »

  1.   

    应该有一个,我用了tfilestream,tmemorystream;打开一个几百M的东东就会占很大的内存,然后我对tmemorystream操作,保存为文件后,内存占用就会减少;
      

  2.   

    应该是存在一个拷贝我们看下TStream的Read函数:
    function Read(var Buffer; Count: Longint): Longint; virtual; abstract;
    Buffer指向缓冲区,Count为缓冲区大小;按照我的理解,这个Count应该就是文件的大小,所以就是在内存中开辟了一个与文件大小相同的缓冲区,缓冲区的内容就是文件的内容.
      

  3.   

    按照我的理解,这个Count应该就是文件的大小,所以就是在内存中开辟了一个与文件大小相同的缓冲区,缓冲区的内容就是文件的内容.// 不一定的。。这要看 系统的分配算法 还有你文件的大小 也有可能系统只是做一个文件映射 然后当你真正去读的时候 系统才一部分 一部分的将其从文件中真正读到内存 然后程序再读取。。
      

  4.   

    To ICMGDCHN(天气冻左,着多件衫-->喜欢明月):
    function Read(var Buffer; Count: Longint): Longint;
    Count是要读取的大小吧?不应该是文件的大小。to  lianshaohua(永远深爱一个叫“然”的好女孩儿!)
    只要一Load就会占很大的内存吗?不好意思,我机器上没有Delphi,不能做实验。我总觉得Load的时候不应该直接做一个副本吧,最起码要象beyondtkl(大龙驹<暗黑系魔法师&&赏金猎人>) 说的那样,用到的时候才经过内存吧?
      

  5.   

    TO :jmf2000(蜜蜂)不是说了吗 系统有它的算法的 比如如果你的文件比较小 它可能就马上给你转载 因为这样等你访问的时候速度就快了。。而比较大的话 可能就不一样了。。一个设计良好的OS肯定不会这么低级的 再大你都直接读进去 那还了得
      

  6.   

    TO 蜜蜂:
      我说的COUNT是文件大小是指在把文件LOAD进去时.COUNT的大小为文件大小.TO 大龙驹:
      可能在底层中是以块做为操作吧.或许和CPU的CACHE相似    还有文件流与网络上的流有什么联系,这个不是很清楚,是相同概念吗?还望赐教.
      

  7.   

    TMemoryStream本来就是在内存里面开一整块内存,
    要读文件干嘛不用TFileStream,需要多少就载入内存多少。
      

  8.   

    是读到内存中去的,如果文件很大,建议用其他的方式进行操作,API,