Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удалить подстроку из очень большой строки (больше 2 ГБ ) [D7, WinXP]


Страницы:   1 2 3 4 5 6 7

*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?


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо