Быстрое копирование файла

Тема в разделе "WASM.WIN32", создана пользователем coocky, 8 янв 2008.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Привет.
    Вообщем занимаюсь вопросом как бы быстрей всего перегнать файл большого размера. Читал много статей.Остановился на
    Код (Text):
    1. HANDLE fsources=CreateFile(temp1,GENERIC_READ,FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING ,FILE_FLAG_NO_BUFFERING/*(0x01000000L)*/,NULL);
    2.    
    3. VOID *a=VirtualAlloc(0,64*512,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
    4.  
    5. HANDLE fdestination=CreateFile (temp2,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_DELETE|FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH,NULL);
    6.  
    7.  while (ReadFile (fsources, a, 64*512, &read, 0) && read)
    8.  
    9.  {
    10.      WriteFile (fdestination, a, read, &read, 0);
    11.  }
    12.  
    13.                                          
    14.  CloseHandle (fsources);
    15.  CloseHandle (fdestination);
    16.  VirtualFree(a,0,MEM_RELEASE);
    Что-то ничего не не увидел суперского.Судя по скорости (смотрел через PExplorer) ничего особого не получил. Explorer ,вроде,быстрее работает.
    Кто что подскажет?
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    В Far'е: F9\Параметры\Системные параметры\
    есть флажок "Использовать системную функцию копирования".
    у мну быстрее копирует с этим флажком.
     
  3. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    Можно замапить сурс файл и скинуть блоками в таргет, тока я хз насколько быстро это будет :)
     
  4. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    А чем CopyFile не устраивает ?
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    coocky
    В тоталкомандере есть опция "big file copy mode", её параметры таковы: размер блока 10240 кб при копировании в пределах одного винта, 64к в противном случае.

    А вообще, тема обсуждалась, поищи.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    я бы разбил на 2 потока - считывающий блоками и записывающий.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    lamer2k
    Не будет быстрее - будет только потеря времени на то, чтобы системе обработать ошибки страниц и инициировать вообщем-то такие же операции с диском, как обычно.
     
  8. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Гм....
    т.е. сперва мы оригинальный файл считываем в буфер, а оттуда уже записываем в новый файл

    Может сразу юзать файловый мэппинг.
    И напрямую перегонять из одного буфера в другой? Без промежуточного?
     
  9. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Да говорю ж-читал много статей. У вас искал-ненашел.Честно :)
    Искал по слову FILE_FLAG_NO_BUFFERING
    Что касается способов-то приводился какой-то пример от Рихтера (не читал-не знаю). Но люди его обогнали. В основном идет холивар между файл маппингом и моим способом (ну это не мой, а с МСДН взят,согласно пояснению про флаги CreateFile. Т.е записывать без кэширования,размер кратный 512, а под буфер место выделят функцией VirtualAllock-она там побайтовое выравнивание делает)
    Маппинг где-то там проигрывает (ну не помню в чем )
    Ха.. Дык вроде народ говорит ,что там с кешированием..
    Ну во первых итак в потоке работает.Неохота усложнят.Ну я б и усложнил-смысл то? Синхронизацию по любому делать прийдется. Или ты подразумевал чтение-запись "вдогонку",с отставанием на один блок?
    А флаги и функции? У меня его нет, так что не посмотреть.:) Что значит в пределах одного винта? Одного винта или тома? Не опечатался?
    Вообще мне сказали, если смотреть на диаграмму скорости чтения -записи,то линия должна быть почти прямая.Без "пилы". У меня вроде небольшая "пилка". У explorera покруче.Но у него быстрее вроде скачки по скорости. Ну вообщем я проигрываю.Хотя вроде правильно делаю....
    Если кто даст ссылку на тему с РЕАЛЬНЫМИ тестами-сенкс.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    можно и в догонку, а можно несложную синхронизацию через событие сделать. во всяком случае скорость чтения > скорости записи как правило.
    во всяком случае прирост должен быть ощутимым.особенно если файлы на разных физ. дисках.
     
  11. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Маппинг проигрывает, особенно на больших объёмах. Собственно вот тема http://gzip.rsdn.ru/Forum/message/1163592.flat.1.aspx где это обсуждается. В конце, кстати, приводятся API ReadFileScatter/WriteFileScatter. Сам не пробовал, но возможно поможет.
     
  12. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Читал.Смотрел МСДН
    Все таки с ограничеием.Вообщем буду пробывать опытным путем.Мож и найду какую зависимость.Кстати-очень сильно зависит от свободного места-чем больше, тем лучше.Возможно связано с фрагментацией...
     
  13. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Ощутимый прирост в скорости может наблюдаться только при копировании с одного физического диска на другой. Тут может помочь многопоточность. Фишка в том, чтобы одновременно читать с одного диска и писать на другой, а не по очереди.
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    drmist
    угу, я про это и писал.
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    coocky
    Для копирования у тебя размер буфера слишком маленький. При чередовании чтения и записи не- или слабо-фрагментированных файлов существенное время тратится на перемещение головок винта. Чтобы только поймать нужный сектор для записи требуется до 1/7200(об/мин) = 8 мс, плюс перемещение головки на дорожку того же порядка. Если даже взять умеренную скорость чтения\записи ~32 Мб/с, то на чтение\запись буфера размером 64*512 = 32К требуется не более 32К/32М = 1мс, т.е. 1мс читаем и 8-15мс ловим сектор для записи. Чтобы снизить относительные потери на позиционирование до 10% и менее нужно увеличить размер буфера раз в 100, т.е. до 3-6 Мб

    см. аналогичный вопрос