Привет. Вообщем занимаюсь вопросом как бы быстрей всего перегнать файл большого размера. Читал много статей.Остановился на Код (Text): HANDLE fsources=CreateFile(temp1,GENERIC_READ,FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING ,FILE_FLAG_NO_BUFFERING/*(0x01000000L)*/,NULL); VOID *a=VirtualAlloc(0,64*512,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE); 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); while (ReadFile (fsources, a, 64*512, &read, 0) && read) { WriteFile (fdestination, a, read, &read, 0); } CloseHandle (fsources); CloseHandle (fdestination); VirtualFree(a,0,MEM_RELEASE); Что-то ничего не не увидел суперского.Судя по скорости (смотрел через PExplorer) ничего особого не получил. Explorer ,вроде,быстрее работает. Кто что подскажет?
В Far'е: F9\Параметры\Системные параметры\ есть флажок "Использовать системную функцию копирования". у мну быстрее копирует с этим флажком.
coocky В тоталкомандере есть опция "big file copy mode", её параметры таковы: размер блока 10240 кб при копировании в пределах одного винта, 64к в противном случае. А вообще, тема обсуждалась, поищи.
lamer2k Не будет быстрее - будет только потеря времени на то, чтобы системе обработать ошибки страниц и инициировать вообщем-то такие же операции с диском, как обычно.
Гм.... т.е. сперва мы оригинальный файл считываем в буфер, а оттуда уже записываем в новый файл Может сразу юзать файловый мэппинг. И напрямую перегонять из одного буфера в другой? Без промежуточного?
Да говорю ж-читал много статей. У вас искал-ненашел.Честно Искал по слову FILE_FLAG_NO_BUFFERING Что касается способов-то приводился какой-то пример от Рихтера (не читал-не знаю). Но люди его обогнали. В основном идет холивар между файл маппингом и моим способом (ну это не мой, а с МСДН взят,согласно пояснению про флаги CreateFile. Т.е записывать без кэширования,размер кратный 512, а под буфер место выделят функцией VirtualAllock-она там побайтовое выравнивание делает) Маппинг где-то там проигрывает (ну не помню в чем ) Ха.. Дык вроде народ говорит ,что там с кешированием.. Ну во первых итак в потоке работает.Неохота усложнят.Ну я б и усложнил-смысл то? Синхронизацию по любому делать прийдется. Или ты подразумевал чтение-запись "вдогонку",с отставанием на один блок? А флаги и функции? У меня его нет, так что не посмотреть. Что значит в пределах одного винта? Одного винта или тома? Не опечатался? Вообще мне сказали, если смотреть на диаграмму скорости чтения -записи,то линия должна быть почти прямая.Без "пилы". У меня вроде небольшая "пилка". У explorera покруче.Но у него быстрее вроде скачки по скорости. Ну вообщем я проигрываю.Хотя вроде правильно делаю.... Если кто даст ссылку на тему с РЕАЛЬНЫМИ тестами-сенкс.
можно и в догонку, а можно несложную синхронизацию через событие сделать. во всяком случае скорость чтения > скорости записи как правило. во всяком случае прирост должен быть ощутимым.особенно если файлы на разных физ. дисках.
Маппинг проигрывает, особенно на больших объёмах. Собственно вот тема http://gzip.rsdn.ru/Forum/message/1163592.flat.1.aspx где это обсуждается. В конце, кстати, приводятся API ReadFileScatter/WriteFileScatter. Сам не пробовал, но возможно поможет.
Читал.Смотрел МСДН Все таки с ограничеием.Вообщем буду пробывать опытным путем.Мож и найду какую зависимость.Кстати-очень сильно зависит от свободного места-чем больше, тем лучше.Возможно связано с фрагментацией...
Ощутимый прирост в скорости может наблюдаться только при копировании с одного физического диска на другой. Тут может помочь многопоточность. Фишка в том, чтобы одновременно читать с одного диска и писать на другой, а не по очереди.
coocky Для копирования у тебя размер буфера слишком маленький. При чередовании чтения и записи не- или слабо-фрагментированных файлов существенное время тратится на перемещение головок винта. Чтобы только поймать нужный сектор для записи требуется до 1/7200(об/мин) = 8 мс, плюс перемещение головки на дорожку того же порядка. Если даже взять умеренную скорость чтения\записи ~32 Мб/с, то на чтение\запись буфера размером 64*512 = 32К требуется не более 32К/32М = 1мс, т.е. 1мс читаем и 8-15мс ловим сектор для записи. Чтобы снизить относительные потери на позиционирование до 10% и менее нужно увеличить размер буфера раз в 100, т.е. до 3-6 Мб см. аналогичный вопрос