| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Оптимальный метод копирования |
| Автор: BpIstorick 8.7.2006, 00:21 |
| какой метод копирования лучше, то есть - быстрее идет, а так же меньше нагрузка на проц Методы которые знаю - BlockRead, BlockWrite - SHFileOperation - CopyFile - потоковое копирование (но его фигова знаю какой из них приоритетен!, если есть что добавить то пжалуйста Какой из них вообще возможно реализовать с прогрессБаром (собственно ручно сделанным, а не виндовским) |
| Автор: Alexeis 8.7.2006, 00:43 |
Еще есть файлы отображаемые в память. Если этот вопрос для вас принципиален, то скажу что однозначного ответа здесь нет - все зависит от размера файла и взаимного расположения источника и места назначения. Добавлено @ 00:45 Да любой если переписывать не файл целиком, а по частям. Добавлено @ 00:49 Для быстрого переписывания больших файлов (музыки, фильмов) с одного логического диска на другой желательно использовать большой буфер. Я один раз ради эксперимента написал такую програмку, так она работала В 2,5 РАЗА БЫСТРЕЕ чем копирование ч/з explorer и использовала буфер в 50МБ. |
| Автор: Alexeis 8.7.2006, 01:54 |
Мда |
| Автор: BpIstorick 8.7.2006, 07:05 |
| Вопрос возник в принципе после прочтения большого количества подобных тем форума Ситуация: два случая - с логического на логический - на сетевой диск Вопрос! При использовании BlockRead, BlockWrite наблюдал огромную нагрузку на проц! а это не есть ГУД Потом нашел строчку что 3*4*4096 of Byte есть оптимальный буффер, а вообще зависимость какая? больше буффер -> больше нагрузка на ХАРД, или здесь нелинейная??? и какия хитрости? p.s. В этом методе я разобрался лучше всего |
| Автор: Alexeis 8.7.2006, 14:45 | ||
| Стоит потому что они позволяют копировать файлы более 4Гб. Добавлено @ 14:56
фокус в том что последовательное считывание кластеров, намного быстрее случайного, если головка винта почти не перемещается(не скачет), то передача данных сильно ускоряется. Вообще желательно использовать буфер на 2-3Мб, т.е. на размер кэша финта, но больший размер все равно ускорит копирование, но при этом будет набльдаться некоторое торможение системы, т.к. Операции с винтом имеют высокий приоритет, да и другие програмы не прочь поработать сами с винтом, WinXp, тот вообще часто к подкачке обращается, независимо хватает ему ОЗУ или нет. |
| Автор: BpIstorick 10.7.2006, 00:17 |
| Спасибо всем за разъяснения |
| Автор: BUGOR 10.7.2006, 09:40 |
| А почему про API ни слова? Мой опыт показывает, что файлы размером не больше 50 мб быстрее всего обрабатываются с помощью MMF(Memory Mapped Files), даже на 256 метрах памяти, ибо идёт проекция на память, а работа с оперативкой само собой намного быстрее работы с хардом, но файлы большего размера я советую копировать с помощью Read/WriteFile и при этом буфер брать размером не 50 метров, а 64 Кб. |
| Автор: Alexeis 10.7.2006, 09:46 |
| BUGOR, |
| Автор: Akella 10.7.2006, 09:57 | ||
с использую CopyFile - Винда сама копирует, и я не думаю, под какой версией работает моя прога, и не думаю, какого размера будет файл и какой размер буфера мне ставить. |
| Автор: BpIstorick 10.7.2006, 14:54 | ||||
А от чего вообще буфер высчитывается? от личного "хочу" или есть параметры к которым он привязывается Попробовал установить буфер размером
выдается сообщение "Stack Overflow" (как я понимаю это в переводе - стек перегружен...)! необходимо получается выделять отдельно память??? или в чем моя ошибка??? p.s. во вложении проект в котором ошибка! проект чисто для разбора с матерьялом создан |
| Автор: Matematik 10.7.2006, 15:00 | ||||
Динамическое выделение
|
| Автор: Alexeis 10.7.2006, 17:15 |
точнее переполнен, это возникает либо при неправельной рекурсии, либо при обилии локальных данных! Добавлено @ 17:19 Динамическая память выделяется в куче, а не в стеке. Непойму к чему Добавлено @ 17:22 Конечно же! вот где собака зарыта! Надо было делать динамический массив! Matematik, sorry, теперь понял о чем шла речь с p:=AllocMem(BufSize) |
| Автор: BpIstorick 10.7.2006, 20:55 |
несколько раз вчитывался и вдумывался, но так и не понял в чем моя ошибка и где зарыта собака! 1. если я буду использовать динамический массив, то все получится??? 2. если буду динамически создавать буффер в виде выделенной памяти, то тоже все получится??? а чем мой статический массив не подошел??? в чем загвоздка??? p.s. и все равно никто не ответил! почему 64к или 48к буфер должен быть? из-за разрядности и доступа к памяти проще процессору обращаться(мои размышления)??? или все таки просто нужно поверить этому и забить |
| Автор: Alexeis 11.7.2006, 00:20 | ||||
И то и другое ВЕРНО! Он жрет память из стека, вот стек и закончился
это же целый мегабайт - размер всего стека, плюс прога еще расходует на внутренние цели, вот и закончился стек - stack overflow! Глупости, зависит от устройства передачи и приема! Для HDD обычно берут 2Mb |
| Автор: BpIstorick 11.7.2006, 08:17 |
| Попробовал оба способа: 1. динамическое выделение памяти 2. С помощью динамического массива пришел к выводу что лучше статического массива ничего не придумать скорость в первых двух случаях получалась почему-то вообще мизерной (50-150 kb), а при помощи статического массива достигала реальных 10 и более мегабайт в секунду так же пришел к выводу, что нужно разбираться со структурой самой программы для должного понимания почитать подскажите где |
| Автор: Alexeis 11.7.2006, 09:22 | ||||
У меня при помощи динамической памати получалось 14Мбайт в секунду c логического на логический! на Segate ATA100 80Гб, а с Segate ATA100 80Гб на Segate ATA100 200Гб вообще 25 Мбайт в секунду!
Выкладывайте код процедуры мы поможем разобраться! |