![]() |
| ||
|
|
Новости |
Поиск |
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 Гб. Не говря уже о других операциях. Надо что-то придумать.
Заранее всем ольшое спасибо за предложенные варианты!
oxffff (2007-09-09 22:57:00) [21]Ваш код не работает.
Грабли первые
procedure TForm1.Button1Click(Sender: TObject);
var b,c:string;
begin
c:='dsads';
DeleteString(c,'ad');
showmessage(c);
end;
ловите AV.
Sha (2007-09-09 22:47:00) [22]Ну, например, процедура [62] ничуть не хуже, но без заложенных бомб.
И чтоб ее испьзовать, не надо быть "профессионалом".
А про кривизну в своем коде со временем забудешь - и бомба сработает.
Нужен ли такой "профессионализм"?
oxffff (2007-09-09 22:36:00) [23]
> Sha © (09.09.07 22:29) [113]
> > oxffff © (09.09.07 22:21) [110]
> > oxffff © (09.09.07 22:21) [110]
>
> Ты это серьезно?
>
> По-моему, так объяленная функция
> function FastDel(const A:string;Pos,Count:integer):boolean;
>
> обязана допускать такое использование
> FastDel(a,2,3); ShowMessage(a);
> FastDel(a,2,3); ShowMessage(a);
>
> Если ты считаешь иначе, то у меня нет слов...
Очень жаль.
Я собственно считаю, что если человек как профессионал разбирается в тонкостях работы, что написание оптимизированной процедуры с потерей гибкости, это проявление компромиса, а значит ума.
Sha (2007-09-09 22:29:00) [24]> oxffff © (09.09.07 22:21) [110]
> oxffff © (09.09.07 22:21) [110]
Ты это серьезно?
По-моему, так объяленная функция
function FastDel(const A:string;Pos,Count:integer):boolean;
обязанадопускать такое использование
FastDel(a,2,3); ShowMessage(a);
FastDel(a,2,3); ShowMessage(a);
Если ты считаешь иначе, то у меня нет слов...
oxffff (2007-09-09 22:24:00) [25]
> MetalFan © (09.09.07 22:05) [104]
>
> > Только скорость отображения страниц на линейное пространство
>
> > быстрее, чем подкачка из mapped файла . :)
> >
>
> ага, а исходная строка на >2Gb в памяти сама по себе возникнет?
> !
Мыслите шире. Это может быть блок сгенерированный run time.
oxffff (2007-09-09 22:21:00) [26]
> Sha © (09.09.07 22:13) [108]
> Любой нормальный программист ожидает, что после
> a:='123456789'; ShowMessage(a);
> он увидит на экране строку '123456789' а не "189".
> Огромное спасибо тебе от него обеспечено.
Читать [82].
oxffff (2007-09-09 22:21:00) [27]procedure TForm1.Button1Click(Sender: TObject);
const
a1:string='123456789';
a2:string='123456789';
begin
FastDel(a1,2,3); ShowMessage(a1);
FastDel(a2,2,3); ShowMessage(a2);
ShowMessage(a1);
end;
oxffff (2007-09-09 22:19:00) [28]
> Sha © (09.09.07 22:09) [106]
> > oxffff © (09.09.07 21:58) [103]
> > Удивляться то чему?
>
> Тому, о чем ты даже не подозреваешь )))
Я написал решение вашей проблемы в
oxffff © (09.09.07 20:06) [82].
А именно в вынуждении компиляторы избежать shared констант.
Sha (2007-09-09 22:13:00) [29]Любой нормальный программист ожидает, что после
a:='123456789'; ShowMessage(a);
он увидит на экране строку '123456789' а не "189".
Огромное спасибо тебе от него обеспечено.
oxffff (2007-09-09 22:10:00) [30]
> Riply © (09.09.07 21:45) [100]
Да и примеры строк из сегмента данных, да еще shared констант надуманны.
Я показал пример, как выкрытиться с блоком данных, если нет возможности выделить дополнительный рабочий блок.
Что касаемо использование /3gb, AWE и MMF, то не составляет написать небольшой класс обертку.
За сим откланиваюсь.
Sha (2007-09-09 22:09:00) [31]> oxffff © (09.09.07 21:58) [103]
> Удивляться то чему?
Тому, о чем ты даже не подозреваешь )))
Riply (2007-09-09 22:09:00) [32]> [103] oxffff © (09.09.07 21:58)
>Неужели трудно прочитать первое предложение из oxffff © (09.09.07 20:06) [82].
Прочтала. Чесно говоря не поняла.
Поясни.
>Удивляться то чему?
Тому что следующий код выдает сообщение: "189" вместо "123456789" :)
//выдернуто из контекста
a:='123456789';
ShowMessage(a);
//конец выдергивания
>Неподготовленный вынуждает компилятор сделать две копии.
MetalFan (2007-09-09 22:05:00) [33]
> Только скорость отображения страниц на линейное пространство
> быстрее, чем подкачка из mapped файла . :)
>
ага, а исходная строка на >2Gb в памяти сама по себе возникнет?!
oxffff (2007-09-09 21:58:00) [34]
> Riply © (09.09.07 21:45) [100]
Неужели трудно прочитать первое предложение из
oxffff © (09.09.07 20:06) [82].
Удивляться то чему?
oxffff (2007-09-09 21:56:00) [35]
> Инс © (09.09.07 21:17) [96]
>
> > Что принципиально ограничивает вас работать со строкой
> >2-3GB?
>
> Как с целым неразрывным блоком данных - да. Как с типом
> string - да.
Что да?
> Anatoly Podgoretsky © (09.09.07 21:17) [97]
> > oxffff (09.09.2007 21:15:35) [95]
>
> Строка это что? string - тогда это индекс, array [] of char
> - тогда тоже индекс.
> Файл - ни что не ограничивает, как и в 16 бит, кроме ограничений
> ОС
Используйте pchar и будет вам счастье.
Либо сделайте аналог string типа c заголовком
StrRecEx = packed record
refCnt: int64;
length:int64 ;
end;
> MetalFan © (09.09.07 21:26) [99]
> если вдруг мне бы пришлось решать подобную(subj) задачу,
> я бы использовал MMF и не парил бы окружающим мозг в попытке
> отхавать у системы более 2Гб памяти... тем более для сабжевой
> задачи это(отхавывание) абсолютно не нужно.
Только скорость отображения страниц на линейное пространство быстрее, чем подкачка из mapped файла . :)
Riply (2007-09-09 21:47:00) [36]> [100] Riply © (09.09.07 21:45)
P.S.
Имелась ввиду последняя версия FastDel, предложенная тобой.
Riply (2007-09-09 21:45:00) [37]>[82] oxffff © (09.09.07 20:06)
Почему ты рассматриваешь только "свою" проверку ?
Потестируй не на своем примере, а на
контрпримере, предложенным в [80] Sha © (09.09.07 19:30),
"буква в букву", а именно:
procedure TForm1.Button5Click(Sender: TObject);
var
a, b: string;
begin
a:='123456789'; FastDel(a,2,3); ShowMessage(a);
a:='123456789'; FastDel(a,2,3); ShowMessage(a);
a:='123456789'; ShowMessage(a);
end;
Будешь удивлен. Правда :)
MetalFan (2007-09-09 21:26:00) [38]если вдруг мне бы пришлось решать подобную(subj) задачу, я бы использовал MMF и не парил бы окружающим мозг в попытке отхавать у системы более 2Гб памяти... тем более для сабжевой задачи это(отхавывание) абсолютно не нужно.
Anatoly Podgoretsky (2007-09-09 21:18:00) [39]> Инс (09.09.2007 21:17:36) [96]
Компилятор не позволит создать суммарную длину структур + код, свыше 2 гб.
Инс (2007-09-09 21:17:00) [40]
> Что принципиально ограничивает вас работать со строкой >2-3GB?
Как с целым неразрывным блоком данных - да. Как с типом string - да.