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 Гб. Не говря уже о других операциях. Надо что-то придумать.

Заранее всем ольшое спасибо за предложенные варианты!


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 - да.


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

Наверх

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