![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удалить подстроку из очень большой строки (больше 2 ГБ ) [D7, WinXP]
*Ray* © (2007-09-07 18:42:00)Здравствуйте, уважаемые мастера! Столкнулся со стандартной вроде бы задачей, но с интересного ракурса. Задача проста: Нужно написать функцию, удаляющую все вхождение подстроки в строке. Но есть одно условие: строка очень большая - около 2 Гб, может и больше, и нужно чтобы функция была максимально оптимизирована. Вот здесь я немного теряюсь.
Я сделал так:
Function Del_Str (longstring, string: string):string;
begin
while pos(str, longsting)>0 do
begin
del(longstring, pos(str, longstring), length(str)) ;
end;
result:=longstring;
end;
Функция работает, но одно даже присваивание result значение longstring займет в памяти 4 Гб, если строка 2 Гб. Не говря уже о других операциях. Надо что-то придумать.
Заранее всем ольшое спасибо за предложенные варианты!
Инс (2007-09-07 21:38:00) [81]
> [55] Palladin © (07.09.07 21:37)
Бррр, казнить нельзя помиловать... Можно со знаками препинания?
Palladin (2007-09-07 21:37:00) [82]
> Инс © (07.09.07 21:28) [52]
нет конечно, сама передача string конечно осуществляет сам string во всей его сущности... вместе со счетчиком... правда, конечно, механизм передачи string разный в delphi и origial pascal... для этого и есть, такая великая вещь как, const :)
Инс (2007-09-07 21:35:00) [83]
> [53] Palladin © (07.09.07 21:32)
Да уж, как закончу с Руссиновичем, сажусь за букварь учиться читать... Звиняй, если чем обидел, ибо был неправ.
Palladin (2007-09-07 21:32:00) [84]
> Инс © (07.09.07 21:23) [51]
а оно очень часто так и бывает... изза не внимательного прочтения... сдаста случай приеду... :)
Инс (2007-09-07 21:28:00) [85]Операциядействительно приводит к дублированию строки вследствие неявного вызова UniqueStringA. Но не сама передача.
Инс (2007-09-07 21:23:00) [86]
> опа... где это я написал в [8]... перечитай пожалуйста...
Перечитал. Вот она причина. Мне почему-то показалось, что вы имеете в виду [46]. Тогда ладно, верю. Тоже посыпаю голову пеплом. ;) Приезжай на пиво!
Инс (2007-09-07 21:18:00) [87]
> > операция со
> > строкой не переданной как var приводит к ее дубляжу и
> модификации
> > дубликата... особенно при выполнении del()... информация
>
> > переданная в идентификаторе параметром должна остаться
> не
> > тронутой..
Спорим! :)) На ящик пива! А?
Palladin (2007-09-07 21:18:00) [88]
> Инс © (07.09.07 21:14) [46]
опа... где это я написал в [8]... перечитай пожалуйста...
Palladin (2007-09-07 21:18:00) [89]
> Инс © (07.09.07 21:18) [48]
спорим...
Palladin (2007-09-07 21:17:00) [90]
> Инс © (07.09.07 21:12) [44]
Это мне? Прекрасно знаю..
Цель? Доказать мне что то...
Только что понять не могу...
> Dib@zol © (07.09.07 21:13) [45]
Доходчиво кому и в связи с чем?
> операция со
> строкой не переданной как var приводит к ее дубляжу и модификации
> дубликата... особенно при выполнении del()... информация
> переданная в идентификаторе параметром должна остаться не
> тронутой..
доходчиво?
Инс (2007-09-07 21:14:00) [91]
> просто мне инетресно, а что это должно было доказать то?
То, что при передаче строки параметром в процедуру дубляжа не происходит, как вы написали в [8], не зависимо от слова var. До сих пор не согласны? Можем продолжить спор.
Dib@zol (2007-09-07 21:13:00) [92]> Здесь причина дубляжа - это операция Copy, а не передача
> строки в процедуру. При передачи строки дубляж не происходит,
> копируется указатель.
Доходчиво?
Инс (2007-09-07 21:12:00) [93]
> String это отнюдь не указатель на что то в памяти...
Если точнее, String - это 4-байтный тип, который по своему смыслу является указателем на первый символ строки в динамической памяти. По смещению -4 от первого символа хранится длина этой строки, по смещению -8 - счетчик ссылок. Строка завершается нулевым символом. Для компилятора - это не просто указатель, это сложный финализируемый тип, для которого он формирует особый код.
Palladin (2007-09-07 21:10:00) [94]
> Инс © (07.09.07 21:05) [41]
прошу прощения... '!orm'... обшибся... да, позор на мою голову... пепел и все такое просто F и ! очень похожи...
просто мне инетресно, а что это должно было доказать то?
Dib@zol (2007-09-07 21:06:00) [95]> Значит все-таки '!orm1'? Так?
Неа. !orm2. гыгыгы. Но тем не менее первый символ - это '!', подтверждаю.
Инс (2007-09-07 21:05:00) [96]
> неужели?
Сейчас я вам это докажу, будьте сдержанней :))
> String это отнюдь не указатель на что то в памяти...
Скажем так, для компилятора - это нечто сложнее, а для процессора - именно указатель.
Значит все-таки '!orm1'? Так? Подтвердите мои слова, бо я не знаю, можно ли продолжать спор?
Palladin (2007-09-07 21:02:00) [97]
> ЗЫ: Я то понимаю ))
неужели? а с чего ты вдруг параметробъявленный как String приводишь к PChar и присваиваешь по указателю Pointer(s) (где s:String) какоето значение? я вообще не понимаю каким боком PChar сюда притесался то? пресловутая совместимость PChar и String не так совместима как ты думаешь... String это отнюдь не указатель на что то в памяти...
Инс (2007-09-07 20:58:00) [98]Кстати, не нравится PChar, давайте сделаем так:
PByte(s)^:=Ord('!');
суть не изменится
Инс (2007-09-07 20:56:00) [99]
> ну естественно,что дальше то? надеюсь ты понимаешь разницу
> между String и PChar?
Какое сообщение выскачило, прежде чем двигаться дальше?
ЗЫ: Я то понимаю ))
Palladin (2007-09-07 20:55:00) [100]
> Инс © (07.09.07 20:48) [34]
ну естественно,что дальше то? надеюсь ты понимаешь разницу между String и PChar?