Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

Удалить подстроку из очень большой строки (больше 2 ГБ )   Найти похожие ветки 

 
Sha ©   (2007-09-09 19:30) [80]

> oxffff ©   (09.09.07 13:34)

Ты на вопрос ответь, что будет выдано твоей процедурой из [22] ?
function FastDel(const A:string;Pos,Count:integer):boolean;
var pi:pinteger;
begin
result:=false;
if (length(a)+1<pos+count) or (pos<1) then exit;
CopyMemory(pointer(DWORD(A)+Pos-1),pointer(DWORD(A)+Pos+Count-1),length(a)-pos-count+2);
pi:=pointer(a);
dec(pi);
PI^:=PI^-count;
result:=true;
end


с любыми прибамбасами типа
VirtualProtect(pointer(a),length(a),PAGE_EXECUTE_READWRITE,Old);

при такой последовательности вызовов:
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;


И что ожидает увидеть неподготовленный :) человек ?


 
Юрий Зотов ©   (2007-09-09 20:04) [81]

> Palladin ©   (07.09.07 20:22) [29]

Мэтр, конечно, не обиделся, а улыбнулся. И если Вы прочтете [28], то тоже улыбнетесь. Поскольку мэтр оказался-таки прав, сочтя, что лучший ответ на ТАКОЙ сабж - молчание.

Они такие, панимашь, эти мэтры с киломэтрами, их на развод так просто не купишь...
:о)


 
oxffff ©   (2007-09-09 20:06) [82]


> И что ожидает увидеть неподготовленный :) человек ?


Неподготовленный вынуждает компилятор сделать две копии.

function FastDel(const A:string;Pos,Count:integer):boolean;
var pi:pinteger;
   Old:DWORD;
begin
VirtualProtect(pointer(a),length(a),PAGE_EXECUTE_READWRITE,Old);
result:=false;
if (length(a)+1<pos+count) or (pos<1) then exit;
CopyMemory(pointer(DWORD(A)+Pos-1),pointer(DWORD(A)+Pos+Count-1),length(a)-pos-count+2);
pi:=pointer(a);
dec(pi);
PI^:=PI^-count;
result:=true;
end;

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 20:15) [83]


> Инс ©   (07.09.07 20:14) [27]
>
> > Объясните пожалуйста поподробнее. Прошу прощения, что
> сразу
> > не заметил.
>
> Юрий Зотов уже объяснил. 2 Гб адресного пространства всего
> доступно приложению в Win32 (еще два - система забирает
> под свои нужды). Из этих двух часть будет уже занята.


Есть еще /3GB.

А еще PAE и AWE.


 
Инс ©   (2007-09-09 20:22) [84]


> Есть еще /3GB.

Я может не знаю все опций и директив компилятору, но где в Delphi можно задать, чтобы программа компилировалась с таким флажком? Даже если и сделать такое приложение, >2GB сплошной блок в памяти в нем все равно скорее всего не выделишь.


 
Anatoly Podgoretsky ©   (2007-09-09 20:25) [85]

> oxffff  (09.09.2007 20:15:23)  [83]

Есть и что они доступны в Дельфи

string = 2^31
integer тоже самое, а вся индексация идет через него


 
oxffff ©   (2007-09-09 20:28) [86]


> Инс ©   (09.09.07 20:22) [84]
>
> > Есть еще /3GB.
>
> Я может не знаю все опций и директив компилятору, но где
> в Delphi можно задать, чтобы программа компилировалась с
> таким флажком? Даже если и сделать такое приложение, >2GB
> сплошной блок в памяти в нем все равно скорее всего не выделишь.
>


Это ключ в boot.ini


 
Инс ©   (2007-09-09 20:40) [87]


> Это ключ в boot.ini

Не на всех версиях системы есть такой ключ. Есть еще директива линкеру на C++  /LARGEADDRESSAWARE. В Delphi ее нет.


 
oxffff ©   (2007-09-09 20:41) [88]


> Anatoly Podgoretsky ©   (09.09.07 20:25) [85]
> > oxffff  (09.09.2007 20:15:23)  [83]
>
> Есть и что они доступны в Дельфи
>
> string = 2^31
> integer тоже самое, а вся индексация идет через него


Согласен.

Я только поправил. :)


 
oxffff ©   (2007-09-09 20:43) [89]


> Инс ©   (09.09.07 20:40) [87]
>
> > Это ключ в boot.ini
>
> Не на всех версиях системы есть такой ключ. Есть еще директива
> линкеру на C++  /LARGEADDRESSAWARE. В Delphi ее нет.


Тогда AWE

AWE solves this problem by allowing applications to directly address huge amounts of memory while continuing to use 32-bit pointers. AWE allows applications to have data caches larger than 4GB (where sufficient physical memory is present). AWE uses physical nonpaged memory and window views of various portions of this physical memory within a 32-bit virtual address space.


 
Инс ©   (2007-09-09 20:44) [90]


> [89] oxffff ©   (09.09.07 20:43)

И что?


 
Anatoly Podgoretsky ©   (2007-09-09 20:49) [91]

> oxffff  (09.09.2007 20:41:28)  [88]

Я так и понял, хоть система может отдать более 2 гб процессу, но все процесс в состоянии с этим работать и из-за этого могут возникнуть проблемы на уровне ОС и процесса.


 
Anatoly Podgoretsky ©   (2007-09-09 20:56) [92]

> Инс  (09.09.2007 20:44:30)  [90]

Тот же вопрос хотел бы задать.


 
oxffff ©   (2007-09-09 21:04) [93]


> Инс ©   (09.09.07 20:44) [90]
>
> > [89] oxffff ©   (09.09.07 20:43)
>
> И что?


> Anatoly Podgoretsky ©   (09.09.07 20:56) [92]
> > Инс  (09.09.2007 20:44:30)  [90]
>
> Тот же вопрос хотел бы задать.


Читаем Инс ©   (07.09.07 20:14) [27]

О каком пространстве идет речь виртуальном, линейном, физическом.
Поэтому я поправил и уточнил, что принципиально возможно использовать более 2 gb памяти.


 
Инс ©   (2007-09-09 21:05) [94]


> [93] oxffff ©   (09.09.07 21:04)

О виртуальном. Читай [4]


 
oxffff ©   (2007-09-09 21:15) [95]


> Инс ©   (09.09.07 21:05) [94]
>
> > [93] oxffff ©   (09.09.07 21:04)
>
> О виртуальном. Читай [4]


Anatoly Podgoretsky ©   (09.09.07 20:25) [85]
> oxffff  (09.09.2007 20:15:23)  [83]

>Есть и что они доступны в Дельфи

>string = 2^31
>integer тоже самое, а вся индексация идет через него


Что принципиально ограничивает вас работать со строкой >2-3GB?


 
Инс ©   (2007-09-09 21:17) [96]


> Что принципиально ограничивает вас работать со строкой >2-3GB?

Как с целым неразрывным блоком данных - да. Как с типом string - да.


 
Anatoly Podgoretsky ©   (2007-09-09 21:17) [97]

> oxffff  (09.09.2007 21:15:35)  [95]

Строка это что? string - тогда это индекс, array [] of char - тогда тоже индекс.
Файл - ни что не ограничивает, как и в 16 бит, кроме ограничений ОС


 
Anatoly Podgoretsky ©   (2007-09-09 21:18) [98]

> Инс  (09.09.2007 21:17:36)  [96]

Компилятор не позволит создать суммарную длину структур + код, свыше 2 гб.


 
MetalFan ©   (2007-09-09 21:26) [99]

если вдруг мне бы пришлось решать подобную(subj) задачу, я бы использовал MMF и не парил бы окружающим мозг в попытке отхавать у системы более 2Гб памяти... тем более для сабжевой задачи это(отхавывание) абсолютно не нужно.


 
Riply ©   (2007-09-09 21:45) [100]

>[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;
Будешь удивлен. Правда :)


 
Riply ©   (2007-09-09 21:47) [101]

> [100] Riply ©   (09.09.07 21:45)
P.S.
Имелась ввиду последняя версия FastDel, предложенная тобой.


 
oxffff ©   (2007-09-09 21:56) [102]


> Инс ©   (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 файла . :)


 
oxffff ©   (2007-09-09 21:58) [103]


> Riply ©   (09.09.07 21:45) [100]


Неужели трудно прочитать первое предложение  из

oxffff ©   (09.09.07 20:06) [82].

Удивляться то чему?


 
MetalFan ©   (2007-09-09 22:05) [104]


> Только скорость отображения страниц на линейное пространство
> быстрее, чем подкачка из mapped файла . :)
>

ага, а исходная строка на >2Gb в памяти сама по себе возникнет?!


 
Riply ©   (2007-09-09 22:09) [105]

> [103] oxffff ©   (09.09.07 21:58)
>Неужели трудно прочитать первое предложение  из oxffff ©   (09.09.07 20:06) [82].
Прочтала. Чесно говоря не поняла.
Поясни.

>Удивляться то чему?
Тому что следующий код выдает сообщение: "189" вместо "123456789" :)
//выдернуто из контекста
a:="123456789";
ShowMessage(a);
//конец выдергивания

>Неподготовленный вынуждает компилятор сделать две копии.


 
Sha ©   (2007-09-09 22:09) [106]

> oxffff ©   (09.09.07 21:58) [103]
> Удивляться то чему?

Тому, о чем ты даже не подозреваешь )))


 
oxffff ©   (2007-09-09 22:10) [107]


> Riply ©   (09.09.07 21:45) [100]


Да и примеры строк из сегмента данных, да еще shared констант надуманны.
Я показал пример, как выкрытиться с блоком данных, если нет возможности выделить дополнительный рабочий блок.

Что касаемо использование /3gb, AWE и MMF, то не составляет написать небольшой класс обертку.

За сим откланиваюсь.


 
Sha ©   (2007-09-09 22:13) [108]

Любой нормальный программист ожидает, что после
a:="123456789"; ShowMessage(a);
он увидит на экране строку "123456789" а не "189".
Огромное спасибо тебе от него обеспечено.


 
oxffff ©   (2007-09-09 22:19) [109]


> Sha ©   (09.09.07 22:09) [106]
> > oxffff ©   (09.09.07 21:58) [103]
> > Удивляться то чему?
>
> Тому, о чем ты даже не подозреваешь )))


Я написал решение вашей проблемы в
oxffff ©   (09.09.07 20:06) [82].

А именно в вынуждении компиляторы избежать shared констант.


 
oxffff ©   (2007-09-09 22:21) [110]


> Sha ©   (09.09.07 22:13) [108]
> Любой нормальный программист ожидает, что после
> a:="123456789"; ShowMessage(a);
> он увидит на экране строку "123456789" а не "189".
> Огромное спасибо тебе от него обеспечено.


Читать [82].


 
oxffff ©   (2007-09-09 22:21) [111]

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:24) [112]


> MetalFan ©   (09.09.07 22:05) [104]
>
> > Только скорость отображения страниц на линейное пространство
>
> > быстрее, чем подкачка из mapped файла . :)
> >
>
> ага, а исходная строка на >2Gb в памяти сама по себе возникнет?
> !


Мыслите шире. Это может быть блок сгенерированный run time.


 
Sha ©   (2007-09-09 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);


Если ты считаешь иначе, то у меня нет слов...


 
oxffff ©   (2007-09-09 22:36) [114]


> 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:47) [115]

Ну, например, процедура [62] ничуть не хуже, но без заложенных бомб.
И чтоб ее испьзовать, не надо быть "профессионалом".

А про кривизну в своем коде со временем забудешь - и бомба сработает.
Нужен ли такой "профессионализм"?


 
oxffff ©   (2007-09-09 22:57) [116]

Ваш код не работает.

Грабли первые

procedure TForm1.Button1Click(Sender: TObject);
var  b,c:string;
begin
c:="dsads";
DeleteString(c,"ad");
showmessage(c);
end;

ловите AV.


 
oxffff ©   (2007-09-09 22:58) [117]

Сейчас еще один недостаток проверю и найду.
Напросились сами.


 
oxffff ©   (2007-09-09 23:05) [118]

Второй недостаток не подтвердился.
SysReallocMem позволяет сделать ResizeInPlace.

Ладно так что исправляйте первый. ;)


 
oxffff ©   (2007-09-09 23:10) [119]

Добавьте

VirtualProtect(pointer(s),length(s),PAGE_EXECUTE_READWRITE,Old);

И проверьте свой же контр пример

procedure TForm1.Button1Click(Sender: TObject);
var  b,c:string;
begin
c:="123456789";
DeleteString(c,"34");
showmessage(c);
c:="123456789";
DeleteString(c,"34");
showmessage(c);
end;

Так что руки у нас с вами из одного и того же места растут. LOL. :)


 
Sha ©   (2007-09-09 23:17) [120]

>  oxffff ©   (09.09.07 22:57) [116] - [119]

Конечно, надо вставить вызов
  UniqueString(s);
перед оператором
 q:=pointer(s); //чтобы компилятор не вставлял вызовы UniqueString
раз уж мы все делаем сами.

Спасибо за найденную неточность :)



Страницы: 1 2 3 4 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.69 MB
Время: 0.055 c
2-1189391632
арпывапр
2007-09-10 06:33
2007.10.07
отключение USB?


15-1189341635
AntiUser
2007-09-09 16:40
2007.10.07
Создан трехмерный голографический дисплей


2-1189580698
artem779
2007-09-12 11:04
2007.10.07
область видимости


15-1189175731
Верующий
2007-09-07 18:35
2007.10.07
Что будет без ИНН?


15-1189256604
Галинка
2007-09-08 17:03
2007.10.07
Переполнение буфера/кучи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский