|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.07.2011, 02:55 | #1 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
Оптимизация потока
Здравствуйте, имеется поток, который шифрует файл. можно ли как-то оптимизировать работу с файлами в этом потоке?
Хакинг - не преступление, а способ выживания.
|
13.07.2011, 02:34 | #2 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
Меня больше интересует как выполнять операции с файлом, не копируя его во временные переменные?
Изначально функции En\DeCryptData были процедурами, и в качестве параметра получали переменную(файл) в которую потом и выводили результат. Если нужно, могу скинуть оригинал файла(с процедурами).
Хакинг - не преступление, а способ выживания.
|
13.07.2011, 03:43 | #3 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Код:
Ну допустим: I. Ты берёшь n байт файла, изменяешь их и записываешь обратно. Эта операция потребует много ресурсов от системы. Тут 6 действий: 1. Получаем размер файла байтах 2. Получаем n байт файла от начала файла 3. Изменяем байты файла 4. Записываем изменённые байты, обратно в файл(Опущу проверку на корректность файла(Байтики-то и сместиться могут)) 5. запоминаем где читали и куда писали 6. Повторяем все выше перечисленно пака байты не закончаться. Минусы: 1. Старый файл будет 100% перезаписан без каких-либо выкрутасов. 2. Нужно следить за тем чтобы файл никто не трогал, пака с ним работает поток. 1 сдвиг, и весь процесс на смарку. 3. Если процесс оборвётся , изменения обратить будет очень сложно. Файл будет испорчен. II. Можно закачать в поток весь файл и быстро его обработать. Тут тоже 3 действия, но выполняются они один раз: 1. загружаем файл в поток 2. меняем байты 3. Сохраняем файл обратно(перезаписав старый или сохранив новый в другом месте), и это + Нежели перекать его 100500 раз в память по байтно. Так что лучше чем поток(Stream) врятли что-то предумаешь. Безопаснее, удобнее и 100% гарантия что оригинал не будет испорчен. Что касается оптимизации. 1. Нигде ни разу не видел Try..finally..end; Стуация: Пользователь повесил программу(Повиг каким образом), и ОЗУ ПК быстро исчезнет пака поток не отработает(Ну или пака он будет закрываться). 2. Вместо TObject.Free используй FreeAndNil(TObject); 3. Нигде нет ни намёка на проверку Terminated флага. Шифрование(ну или что у тебя там), можно разрезать на потоки. просто разбив файл по потокам и раздав по кусочку в каждый TStream для каждого потока. берётся файл, его размер в байтах и по цепочке потоки откусывают n байт файла передав след. потоку указатель на место, до которого откусил предыдущий поток, и так до того момента пака байты не закончаться. Склеивание происходит также, первый поток уведомляет о завершении процесса и передаёт указатель на место, к которому нужно присоеденять байты. Тут есть и минусы и плюсы. Плюс в том что все это будет работать в хреналион раз быстрее. Но нужно чтобы потоки что-то контролировало. Особенно очередь разделения файлов и очередь склеивания. Ведь закончить перым, может и пятый и десятый, а надо с 1 начинать и 10 заканчивать=) Если сначало запишет первый а затем десятый, файл опять будет кривось накось составлн. Собственно минус это установить жосткий контроль над процессом дробления файла между потоками, и сборкой этого файла в правильном порядке. В общем читай о синхронизации потоков. Но ту просто, 1 поток просто контиролирует в кком порядке файл был разобран, и составляет список дескрипторов потоков которые уже закончили обработку, сортирует их и выстраивает правильную очередь для сборки. Затем подаёт команды по одному. Че-то меня попёрло... Все, я спать Ту Последний раз редактировалось Человек_Борща; 13.07.2011 в 03:53. |
13.07.2011, 04:23 | #4 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
Вся сложность в том, что у меня файл можно несколькими алгоритмами (по очереди) шифровать. Т.е.
1.файл грузится в TStream пусть это будет f 2.поток шифруется блоками и записывается в другой TStream(buf). 3.поле этого f заменяется на buf и передается другому алгоритму. 4.buf очищается и шаги 2-3 повторяются. 5.сохраняем результат в файл. мне нужно как-то ускорить этот процесс. чтобы файл например писать сразу в результат. минуя buf. или как-то по другому. p.s. файл в 800кб у меня обрабатывается 4-мя алгоритмами ~5-15 мин. точно не замерял. А файл размером 150мб вешает этот поток.м Кстати, по поводу try..except, спасибо учту, это только пока "скелет" программы, а проверки навешивать я буду позже.
Хакинг - не преступление, а способ выживания.
|
13.07.2011, 10:09 | #5 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
ну шаг с переходом f=>Buffer можно выкинуть у потоков есть метод CopyStream копрует данные одного потока, в другой.
Почитай тов справке. |
14.07.2011, 01:20 | #6 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
Вот мне бы и хотелось избавиться от этого Buf, и работать только с открытым и конечным файлом. Поэтому и спрашиваю как оптимизировать можно.
Хакинг - не преступление, а способ выживания.
|
14.07.2011, 01:27 | #7 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
А про это читал?
Цитата:
|
|
14.07.2011, 02:02 | #8 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
Т.е. без дополнительной переменной не обойтись?. Можно только убрать её инициализацию и освобождение. да?
Хакинг - не преступление, а способ выживания.
|
14.07.2011, 02:56 | #9 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Вы каждый раз меняете алгоритм шифровки, а уже шифрованные данные нужно где-то хранить.
Инициализци и финализация должны быть, если это не массив байт. |
14.07.2011, 03:18 | #10 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
Получается мой вариант (в архиве) менять не нужно? я имею ввиду копирование из одной переменной в другую
Хакинг - не преступление, а способ выживания.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Кодировка потока | cargo29 | Мультимедиа в Delphi | 16 | 20.07.2011 12:51 |
Как узнать номер потока из самого потока? | GaMeSTeR | Помощь студентам | 0 | 03.12.2010 09:50 |
Распараллеливание потока | eXa | Общие вопросы Delphi | 3 | 19.07.2007 20:11 |