接手一个程序,原来是打开一个20m左右的文件将数据存在一个vector的结构里再画图显示。现在想提升打开文件的速度,把打开文件部分做成多线程的,将文件分成多块分别用各个线程打开再存储到vector的相应位置。但是vector的接口貌似不能按指针位置存数据,比如像对数组那样第一个线程的数据存到array[0]开始的内存,后面的线程存到array[n]之后的内存。如果把vector这个存储结构改了的话vector的接口一变整个程序的改动量很大,不知道就保持这个结构或者这个结构的接口有没有办法?

解决方案 »

  1.   

    搞得这么复杂,感觉没必要吧。如果vector不能,就变成普通数组不行吗?
      

  2.   

    按LZ的想法,可以在创建线程之前先为每个线程分配好数据缓冲区,并存入vector中,线程只管向缓冲区中读入数据即可。
    不过多线程来读文件确实不能提升性能,最多把读文件操作放到一个单独的线程里面就够了,这种做法对提高性能的唯一作用就是可以把读文件时等待的时间用来做其它事(除了读同一磁盘设备之外)。
      

  3.   

    只要可能就不想改存储结构vector!这也是发这个问题的原因啊。
    至于性能方面,其实我已经用内存映射处理待打开的文件了,但是对文件里每个数据的处理再存入vector结构还是很花时间,所以才想到用多线程试试能不能提升性能。
    难道vector对这个方案真的无解?
    改存储结构整个程序的改动量太大啊,作为一个试验实在不值得啊~~
      

  4.   

    估计下大概有多少个,然后用vector::reserve试下
      

  5.   

    你可以自己实现一个类似VECTOR的结构,接口都一样,把用到的方法都自己实现
      

  6.   

    1.4G的文件,我用单线程+内存映射,只用了65秒.400M的文件是12秒.关键是看你如何能减少性能上的消耗,特别是类,尽可能用C,少用vector这些东东
      

  7.   

    在UNIX下面,因为服务器是4 CPU的,但还在跑其他服务,我在这种情境下跑的时候,四百兆花了82秒左右,单线程的,CPU不是很快,才800HZ, 然后我用内存映射+多线程,速度就上到了42秒.如果你的机子没有多个CPU,或者多核,其他用单线程就够了,多线程有可能会涉及到同步,同步对性能就有一定损耗的.关键是减少对磁盘的读取,但你这个文件才20M,不是很大的文件,想提升速度的话,就提高你解析每一行数据的速度,例如少用内存分配与释放这种操作,在大数据量操作中,这是很消耗时间的.