情况:
    1、我有大量(10000个或更多)的小文件(大概10k一个),我要打开每一个文件,从中取出数据,然后用我的线程进行处理。
    2、我原来用的是单线程,速度不是很快,线程我改成多线程IO方式读取。效率不是很高(提高了10%)。为什么???
    3、异步多线程IO合单线程IO到底怎么样处理才能提高很多效率???
    4、采取什么方式处理我的情况会更合理???
望各位大哥帮帮。谢谢

解决方案 »

  1.   

    我认为多线程和异步IO都是为了更加充分的利用CPU的资源,而非可以加快对IO的操作。
    所以如果你的处理数据的时间很短,而IO操作的时间很长,我想多线程和异步IO并不能解决你的问题。关注
      

  2.   

    我想能不能我一次性打开所有的文件,把他们的内容放入一个容器中,我在使用的时候从容器中检索,应该能快很多???我的文件中存放是的二进制信息,我应该怎么样设计我容器那》
    map<CString,???,less<CString> > MyMap ;???应该怎么样保存比较好???谢谢
      

  3.   

    I/O的时间是没有办法节省的.
    异步I/O只是把CPU的等待时间去作运算罢了
      

  4.   

    如果只有一个线程,这个线程只读取或者只写入文件,那么异步IO是没多大作用的。
    只有在多个线程并且写入和读取同时进行的时候,异步IO才能发挥威力。
      

  5.   

    如果文件内容都基本不变的话,可以合并成一个大文件,操作前把大文件CreateFileMapping进内存,每个小文件创建一个表示文件信息的结构放在大文件的头部或者单独生成一个文件放入内存(内容可包括文件长度,偏移等等),如果想加快检索的话,也可以采用一些算法,比如散列,AVL树等,这就要根据你关键字的特点来选择了。
      

  6.   

    赞同rwdx(任我独行之浪迹天涯),你这种情况只有用多线程可以提高效率,处理的好应该能够提高到磁盘允许读速度,再高只有调整硬盘了
      

  7.   

    在NT和2000下,通过CreateFile来打开需要读写的驱动器,ReadFile、WriteFile来进行磁盘读写。下面的代码演示了,如何读写A驱/* -----------------------------------------------------Read Floppy Disk Sector for win NT/2000
    reads [numsec] sectors from [head] [track] [sector]-------------------------------------------------------*/
    char* ReadSectors(int head, int sector, int track, int numsec)
    {
    // getting logical sector from absolute head/track/sector ...
    //计算扇区位置
    int LogicalSector = (sector-1) + 
    (head*SECTORSPERTRACK) + 
    (track*SECTORSPERTRACK*NUMOFHEADS) ;char *buffer ; 
    HANDLE hDevice ;
    HANDLE hDevice; 
    char* buffer = (char*)malloc (512*numsec);
    strset ( buffer , ' ');
    DWORD bytesread ;// getting a handle to the drive a: using 
    // CreateFile () function ....
    //打开驱动器 \\.\A:
    hDevice = CreateFile("\\\\.\\A:", 
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING, 0, NULL); if (hDevice == NULL) 
    {
    MessageBox ("Failed !");
    return NULL;
    }
    // setting the file pointer to the start of the 
    // sector we want to read . 
    //移动文件指针到需要读取位置
    SetFilePointer (hDevice, 
    (LogicalSector*512), 
    NULL, 
    FILE_BEGIN); // reading sector(s) ...
    //读数据
    if (!ReadFile ( hDevice, 
    buffer, 
    512*numsec, 
    &bytesread, 
    NULL) )
    {
    /*
    int err;
    char error[10];
    err=GetLastError ();
    itoa (err, error, 10);
    MessageBox (error, "Reading sectors ...Failed ");
    return NULL ;
    */
    }
    //关闭
    CloseHandle(hDevice); return buffer ;
    }
      

  8.   

    10%是由于你的瓶颈是在磁盘i/o上。
    你可以用数据库试试,不要用文件来对数据管理。
    将文件压缩,充分减少磁盘i/o,加内存和cpu,提高处理速度