本帖最后由 jiangsheng 于 2010-04-07 06:05:13 编辑

解决方案 »

  1.   

    既然是稀疏矩阵就把它构造成一个独立的结构体,其中存放行列和值,
    typedef struct _RowColData
    {
      int row; //行
      int col; //列
      double Val; //数据
    }RowColData, *LPRowColData;
    再构造链表或是结构体数组操作的时候根据行列信息来搜索,不存在的值为0
    计算结果也是不用存储数据为0的组
    这样操作的结果就是效率降低,但是时间和空间总是矛盾的,只能是取折中
      

  2.   

    是这样的,只不过是row、col在一起Val单独放,相当于一个已经转换过的稀疏矩阵。
    现在需要的是稀疏矩阵转换的逆过程,转换得到一个真正的稀疏矩阵。然后对所有的空点进行不同的插值,获得一个模拟的二维空间场。
    可是这个逆变换的效率怎么提高呢?
      

  3.   


    现在才用了300M的空间,一个32位系统是2GB,最开辟一块大内存,计算完后,一次性写入磁盘。
      

  4.   

    没错,的确是在文件操作,CPU使用率仅10%左右。
      

  5.   

    估计这是一个可行的办法,我倒是想过排序以后将xy分成mn段,每一个(m,n)对应一次映射的内存快。我试试的,效率肯定能提高。但是还是要解决数据的单个写入的问题。
      

  6.   

    要排序,不要用文件映射。先估算或实测一下排序时间,如果时间较长,可以一边排序一边写文件(可以用异步I/O或多线程)。
    如果需要先读文件再写文件,要把读写缓冲开大一些(几百MB)。
    如果文件保存在NTFS文件系统中,可以创建稀疏文件,在写文件时,跳过不需要写入的片断。
      

  7.   

    是NTFS,稀疏文件还没用过,还麻烦给提示提示。我就想至少有些行估计是没有数据的。
      

  8.   

    在MSDN中查看FSCTL_SET_SPARSE的说明。
      

  9.   

    系统不会立即把内存中的数据写入磁盘,可以通过FlushViewOfFile让系统立即回写。
    不过,你现在这种情况不适合用文件映射。
      

  10.   

    [Quote=引用 14 楼 cnzdgs 的回复:]
    系统不会立即把内存中的数据写入磁盘,可以通过FlushViewOfFile让系统立即回写。
    不过,你现在这种情况不适合用文件映射。
    [/Quot]
    您说不用文件映射是不是需要把大文件拆分成许多的小文件呢还是直接进行文件读写的操作。
    我觉得文件映射和直接进行文件读写应该没有多大差异吧,文件映射好歹操作起来还有点像内存操作呢。
      

  11.   

    可以拆成小文件,不过对于NTFS文件系统没有必要拆分,用稀疏文件的效果比拆分文件要好。
    文件映射只有在对文件的某一段区域进行大量重复读写时才会提高效率,对于大文件的一次性读写,用文件映射无法达到最佳效率,因为文件映射读写文件主要是由系统自动处理的,程序不能充分地进行控制。
    举个例子,你可以自己验证一下:例如要复制一个10GB的文件(假设可用物理内存大于1GB),如果用文件操作每次从源文件连续读500MB,再连续写入目的文件,这样几分钟就可以完成;如果用文件映射方式,创建两个500MB的视图相互复制数据,估计可能你没有耐心等到整个文件复制完成。