数据量不是很大,查找定位不是很复杂的时候,也没有复杂的查询和统计功能的时候,就建议不用数据库了。
你的数据文件的格式是不是可以优化一下。
还有可以一次读多点的数据到内存中,然后处理啊!
我看过一本Oracle的书,讲过一点数据读取优化的东西,好像可以参考一下。
但是忘了书名了。

解决方案 »

  1.   

    用 File Mapping 來做應該十分適合.
      

  2.   

    我有这样一个想法:你的数据类型可能不都一样,比如说有圆,直线,曲线(比方说)那么它们存储的方式就会不同,如果把它们放在同一个文件中,检索时势必会引起速度上的下降;现在如果建一个总的索引文件,另外根据数据的类型的不同各自建一个文件,比如index.3df,Line.3df.ircle.3df....
    在索引文件中指明各个数据存储的简短信息,如类型号,ID号等.然后就可以在相应的文件中计算偏移量,直接读取相应的数据信息,这样的结构在读取几个字节时,效率会非常的高
    读连续数据时,效率也不会输给原来的数据组织方式。
      

  3.   

    用结构化存储把
    iStorage,IStream
      

  4.   

    To smartboyme(小东):
      实际上数据量还是很大的,有时几个G。
      如何一次读多点的数据?//bow
      
      

  5.   

    To windindance(风之舞) 
       我的数据就是在一个文件中的。
    To ahphone(阿丰) 
       实际上,我的数据只有一个类型:点。
       但很有规律,实际上我的数据是一个三维体中每个单位立方体的数据,这个三维体由多个面组
    成,而每个面由多条线组成,最后一条线由多个点组成。如果将每个面的数据放到不同的文件中再
    建立索引会不会提高速度?可对点有什么索引可建?
      

  6.   

    我的意见是,没有复杂的查询和统计,就不要用数据库。
    数据库的作用是用来对很多条相似性的数据组织的,便于查询和定位。还有,如果使用SQL Server,用户的软件成本会提高很多,而且使用也不方便啊!你的数据文件是单个大,还是数量多啊?
      

  7.   

    你可以自己设计一个读文件的缓冲区,每次读512字节的整数倍(如4K),分析完这个缓冲区的数据后再接着读.如果用SEEK, 同样要SEEK到512字节的边界再读,这样可大大提高效率。这样程序会复杂一点,不过你会发现提高的效率会让你觉得非常值得...
      

  8.   

    可以用免费的数据库啊,很多的:
    比如mysql, postgresql等等
    它们都同时支持unix,windows
      

  9.   

    你可以使用操作系统中内存管理的思想. 建立一个缓冲池,里面有若干缓冲区(根据需要建立),缓冲区中存有你最近读取的数据。 读数据时,如果缓冲区中已有,就可能直接从缓冲区中读取。如果没有,就从文件中读取,并将其加入至缓冲池中。如果缓冲池已满,根据一定的算法淘汰旧的缓冲区,如LRU算法等。
      

  10.   

    shit~~~~~这么过分的要求,哪你就一次把文件的所有数据读到内存里面去计算。
    反正现在内存夜便宜
      

  11.   

    为什么这么好的办法Kevin先想到?!!!!!!
      

  12.   

    用文件映射
    所谓文件映射不是把文件全读进来,而是由操作系统来帮你做缓冲,和换页算法。这东西很适合随机读大文件。优点如下:
    1方便,不需复杂编程
    2可以利用空闲的内存,内存不必非常大,但加一点就好一点。
    3有顺序地址的访问,你可以在原有的文件外部建立索引,或什么东西来加速读取此外,我想从数据本身的特性来入手是最有效的。编码如下:
    HANDLE m_File = ::(strPathname,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
    HANDLE m_FileMap = ::CreateFileMapping(
    (void*)0xFFFFFFFF,
    NULL,
    PAGE_READ,
    0,1024,
    NULL
    );
    ASSERT(m_FileMap != NULL);
    if(GetLastError() == ERROR_ALREADY_EXISTS){
    TRACE("the share memory has already existed!\n");
    }
    else{
    TRACE("Create share memory\n");
    }
    void* m_pMapMem = (char*)::MapViewOfFile(this->m_FileMap,FILE_MAP_READ,0,0,0);
    ASSERT(m_pMapMem != NULL);
    //..............use it......................//
    UnmapViewOfFile(m_pMapMem);
    CloseHandle(m_File);
    CloseHandle(m_FILEMap);
      

  13.   

    不好意思,小弟真是没办法了,老板下星期就
    要我交任务,问题贴出来已经两个星期了,就是找不到答案,
    所以真是sorry了,在这占用你们的空间,希望能给小弟一个答复!先谢谢了!!我以CEditView为基类建了一个MDI(其他什么代码我也没写),
    有如下要求:我打开一个*.asm文档,想在光标所在行设一个断点,
    要达到如在bc设断点的效果,在VC怎么做?能详细点回答吗?
    有例子给我就感激不尽了!!
    或转到http://www.csdn.net/expert/topic/171/171611.shtm本人邮箱:[email protected]
      

  14.   

    以前也做过类似的三维项目,我们是将数据分成基本图形类,然后再内存中以指针连表(用CList)管理。
    保存时可在CDocument::Serialize()中直接对CList调用序列化函数。对文件时再恢复成指针连表CList使用。速度不慢。不过你必须为你的C3dPoint,CLine,CCircle等基本图形类添加Serialize()函数,而且必须由CObject派生,这样调用CList:Serialize时MFC会自动去调用这些基本图形类的Serialize().