程序运行时需要建立一棵树,共有四层:
 第一层:                   根结点
                          /   |   \
 第二层:             节点1   节点2  节点3 …… 
                   /   |   \
 第三层:       节点1 节点2 ……
              /  |  \
 第四层: 节点1 节点2 ……建立好之后,我把树写入了文件,以后可以从文件读入内存。
但是发现在读写树的时候,内存占用特别多。明明文件只有3兆,这棵树建立后占用内存达到了30多兆,如果过了一段时间(或者将程序最大化、最小化这么切换一下),占用的内存又比较小了。百思不得其解。
估计是内存页面调度太频繁引起的,实际上可能没有占用这么多内存。所以想事先申请一个大的空间,比如文件大小的2倍,然后每个节点都在大空间里生成。请问应该如何实现?每一层节点的大小不一样。
最好给出一点源代码。多谢了,在线给分!

解决方案 »

  1.   

    用VirtualAlloc系列函数
    具体用法请查阅MSDS相应关键字
      

  2.   

    ok,只是太多了,我慢慢看。如果哪位有现成的代码,贴出来或者发给我吧[email protected].
      

  3.   

    试试用内存映射文件处理你的树文件,相关的函数是CreateFileMapping, MapViewOfFile,UnmapViewOfFile,参考MSDN;这两个函数把你的文件直接映射到内存的某个连续地址区域内,然后你可以象操纵内存块一样操纵文件。值得注意的问题是你可能要临时的修改文件的一些内容,比如把所有的偏移量都转换为指针,但是不需要保存改动,可以利用 FILE_MAP_COPY 和 PAGE_WRITECOPY 标志,以保证文件不被改动。如果只是需要一大块内存,可以用hFile = INVALID_HANDLE_VALUE值调用CreateFileMapping,可以创建基于内存文件的FileMapping。
      

  4.   

    我的问题是,我建立的这个链表都在这个大空间里,我想只给出空间的某个地址,然后希望在里面生成一个结构体。是不是这样:
    MyStructNode mystructnode = (MyStructNode *)内存空间的地址
    然后写入相应的信息,计算这个结构体的偏移量,再重复上述过程。
    因为现在用的CArchive,它已经开辟缓冲区读写数据了,如果再建内存映射文件,会不会太耗资源了。
    我先试试用序列化把数据发放到一大块内存里,再去尝试操作内存映射写文件好了。
    多谢!