|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.06.2009, 17:34 | #1 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Скоростное копирование файлов через RAM
Такая задача: есть файл произвольного размера. Нужно поблочно копировать его в кэш заданного размера и побайтно произвести с ним некие операции и сохранить результат в новый файл. Причем размкр кэша в мб задается пользователем.
Собственно вопрос: как сделать это без загрузки ЦП и достаточно быстро? PS. 1. TMemoryStream как кэш не катит - слишком сильная загрузка ЦП и низкая скорость. 2. Через указатели на статический массив имеет недостаток-немогу задать кэш произвольного размера в программе, только в коде. Как быть? Подскажите, куда копать или примеры. Спасибо.
"ковыряю изнутри" (с)
|
28.06.2009, 20:50 | #2 |
Форумчанин
Регистрация: 16.08.2008
Сообщений: 276
|
А пробовали копировать через TFileStream? Можно копировать куда угодно (хоть в массив, хоть в переменную).
Думаю это быдет выглядеть так: Код:
Искусственный интеллект - фигня по сравнению с естественной глупостью
|
28.06.2009, 21:58 | #3 |
Форумчанин
Регистрация: 12.05.2007
Сообщений: 373
|
можна воспользоваться апишными функцыями:
CreateFile - получение доступа к файлу на чтение/запись SetFilePointer - установить курсор на позицыю ... от начала файла ReadFile - прочитать блок данных с файла в буфер WritwFile - записать блок даных с буфера в файл CloseHandle - закрыть обращение к файлу этими функцыями с файлом можна делать все шо угодно..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен: "Перемен!Мы ждем перемен!" |
29.06.2009, 07:51 | #4 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Нет, вы немного не поняли.
Impuls1989, ваш код я уже проверял до создания этой темы-он медленный! Файл копируется вдвое медленне, чем средствами винды! Как выход: можно создать тип массива байтов длиной от 64 мб (это кэш), в варе переменную-указатель на этот тип, затем при копировании выделять память под него, заполнять кусками по 64 мб, производить операции и записывать в результирующий файл. Только при кэше от 64 мб скорость такого копирования совпадает с виндовской! Собсно дилема: алгоритм то хорош, но нельзя регулировать размер кэша программно, только в коде перед компиляцией, и при малых размерах кэша (менее 64 мб) он не эффективен (медленнее винды)! Код: Код:
Или я туплю и есть варианты проще? Ни у кого не было схожей задачи?
"ковыряю изнутри" (с)
|
29.06.2009, 11:47 | #5 |
Форумчанин
Регистрация: 12.05.2007
Сообщений: 373
|
попробуй такое
Код:
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен: "Перемен!Мы ждем перемен!" |
02.07.2009, 07:29 | #6 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Ntlegend, спасибо! Действительно эта апишная функция эффективнее! И проц несильно грузит.
Только мне не понятен 1 момент: Код:
"ковыряю изнутри" (с)
|
02.07.2009, 08:24 | #7 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
3D Hunter, да. Вы всё правильно поняли.
Вот только я бы рекомендовал переписать кусок, воспользовавшись примером из старого доброго TP: Код:
|
03.07.2009, 10:02 | #8 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Serge_Bliznykov, аргументируйте, пожалуйста, чем лучше процедуры чтения записи нетипизтрованного файла апишных? В своей тестовой проге я пробовал и такой вариант с нетипизтрованными файлами. И тоже медленно, не лучше медленных потоков.
Кстати, если файл открыт с помощью апишной функции CreateFile, то этот хэндл можно использовать в виде параметра в BlockRead/BlockWrite?
"ковыряю изнутри" (с)
|
03.07.2009, 14:21 | #9 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
3D Hunter, вот только не надо мне приписывать то, что я не говорил... я сказал, что вместо цикла:
Код:
repeat ... until (...); ВСЁ. и ничего больше. теперь 2) уже давно я заметил, что на современных мамках (процессорах) + Windows в файловом менеджере FAR крайне желательно в настройках ставить опцию "использовать системную функцию копирования". Это приводит к резкому (иногда в разы) увеличению скорости копирования. я не буду утверждать 100% (не видя, на что это опция влияет внутри самого фара и как там реализовано копирование), но рискну предположить, что в случае этой опции копирование идёт как раз через APIшные функции, что, как показывает данный пример, гораздо эффективнее чтения/записи блоками... Цитата:
|
|
03.07.2009, 19:41 | #10 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
Если читается большими блоками, может быть, в CreateFile отключить системное кеширование? Думаю (но не проверял), что быстрее должно стать. А то, что в TotalCommander'е с включенным "режимом совместимости" (help говорит, что это CopyFileEx) часто быстрее копируется, тоже заметил. Интересно, как CopyFileEx работает тогда...
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
копирование файлов | 59inferno | Общие вопросы C/C++ | 4 | 16.06.2009 15:59 |
Связь с кучей dbf файлов (таблиц) через OLEDB через UNION ALL | Sasha811 | SQL, базы данных | 0 | 01.01.2009 14:04 |
Копирование файлов через http протокол | Serega_P | Работа с сетью в Delphi | 3 | 06.12.2008 14:35 |
Temp INI in RAM | Altera | Общие вопросы Delphi | 5 | 17.02.2008 07:25 |