![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
![]()
Здравствуйте, имеется поток, который шифрует файл. можно ли как-то оптимизировать работу с файлами в этом потоке?
Хакинг - не преступление, а способ выживания.
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
![]()
Меня больше интересует как выполнять операции с файлом, не копируя его во временные переменные?
Изначально функции En\DeCryptData были процедурами, и в качестве параметра получали переменную(файл) в которую потом и выводили результат. Если нужно, могу скинуть оригинал файла(с процедурами).
Хакинг - не преступление, а способ выживания.
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]() Код:
Ну допустим: 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. |
![]() |
![]() |
![]() |
#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, спасибо учту, это только пока "скелет" программы, а проверки навешивать я буду позже.
Хакинг - не преступление, а способ выживания.
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
ну шаг с переходом f=>Buffer можно выкинуть у потоков есть метод CopyStream копрует данные одного потока, в другой.
Почитай тов справке. |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
![]()
Вот мне бы и хотелось избавиться от этого Buf, и работать только с открытым и конечным файлом. Поэтому и спрашиваю как оптимизировать можно.
Хакинг - не преступление, а способ выживания.
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
А про это читал?
Цитата:
|
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 08.08.2010
Сообщений: 371
|
![]()
Т.е. без дополнительной переменной не обойтись?. Можно только убрать её инициализацию и освобождение. да?
Хакинг - не преступление, а способ выживания.
|
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
Вы каждый раз меняете алгоритм шифровки, а уже шифрованные данные нужно где-то хранить.
Инициализци и финализация должны быть, если это не массив байт. |
![]() |
![]() |
![]() |
#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 |