有一个100MB的二进制文件,里面依次存储浮点型的坐标值,如X1 Y1 X2 Y2.........  (X及Y都为double类型)现在想将里面的数据解析出来,存在一个List里面,有什么快速的方法?本人试过struct PointD
{
   public double X;
   public double Y;
   Public PointD(double x,double y)
   {
       X=x;Y=y;
   }
}1:
FileStream fs=.....
BinaryReader br=......
List<PointD> liMyPoints=new List<PointD>();while(fs.Position<fs.Length)
{
   liMyPoints.Add(new PointD(br.ReadDouble(),br.ReadDouble());
}2:byte[] buffer=br.ReadBytes(1024);
int pos=0;
while(pos<buffer.Length)
{
   double x=BitConvert.ToDouble(buffer,pos);
   pos+=8;
   double y=BitConvert.ToDouble(buffer,pos);
   pos+=8;
   liMyPoints.Add(new PointD(x,y));
}以上方法细节上是有问题的,但思路是:
1:逐个读取数据类型
2:先读入一个缓冲内,再从缓冲内进行解析经过测试,2比1快了很多,但仍觉得不够快,请问有没有其他什么更好的方法来更快速地从文件中将每一个点的坐标解析出来呢?

解决方案 »

  1.   

    要提高速度,无非就是在缓存上做文章。给你个建议试试。1、先将大文件分块放入缓存中,比如每个1M。然后再用多线程分别读取和解析每个缓存中的数据。
    2、建议你考虑一下操作系统IO的影响,即文件存储在硬盘上的块大小以及操作系统本身的IO缓存的影响。如果要精确到毫秒级,这些还是需要考虑一下的。
      

  2.   

    byte[] buffer=br.ReadBytes(1024); 
    int pos=0; 
    while(pos <buffer.Length) 

      double x=BitConvert.ToDouble(buffer,pos); 
      pos+=8; 
      double y=BitConvert.ToDouble(buffer,pos); 
      pos+=8; 
      liMyPoints.Add(new PointD(x,y)); 

    这个时间主要浪费在.ToDouble上了。如果能直接按照double类型读取就好了。
      

  3.   

    100MB的二进制文件关键在这里,把100m数据读入内存需要多少时间,需要多少系统资源。
    你的List会有多长,你真的一次就需要这么多数据么?
    还是用一部分读一部分的好。
      

  4.   

    我的在CF底下编程的,将100MB的所有点读到内存里倒是不会,但有时至少会读2M的数据,IO的时间倒是比较少,一般在20ms以内,解析的时间比较长,一次解析3w5q个点需要570ms,我希望更快一些.
      

  5.   

    的确,对于在CF下面,这种高工作密度来说,CPU的空闲时间已经很少了,所以多线程并不能加快速度