Нужна помощь Explode;

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Нужна помощь Explode;

Сообщение vitaly_l » 15.03.2014 15:52:49

alexs писал(а):Выдели сразу память под итоговую строку

Спасибо добрый alexs
:?: А пошаговое выделение памяти сильно тратит время?
:?: Как вычислить размер выделения памяти, не тратя на это времени?
:?: Что быстрее: вычисление размера или пошаговое выделение памяти?
Мне кажется, что пошаговое выделение/добавление - будет быстрее чем, вычисление через length( sMyString[5555555] ); :?:
Или я как обычно ошибаюсь?

И непонятно, почему память автоматом правильно не выделяется при таком коде: while i < 5555555 do sMyStr := sMyStr + arrStrings[i]; :?:
Почему выделение памяти для стрингов - нельзя сразу в компилятор заложить?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Нужна помощь Explode;

Сообщение alexs » 15.03.2014 16:15:02

1. Выделять память надо один раз - в начале всей операции.
Потом просто в выделенный буфер переносишь нужные данные и сдвигаешь указатель на перенесённое число байт.
После всех операций - указатель фактически будет длинной твоей итоговой строки.

2. А пошаговое выделение - это постоянное перераспределение памяти. Поиск по куче первого свободного фрагмента нужного размера, постоянные копирования.
Это ещё приводит и к фрагментации кучи. Как итог - можно и в своп сорваться.

3. Компилятор не знает - сколько в итоге тебе памяти потребуется.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Нужна помощь Explode;

Сообщение vitaly_l » 15.03.2014 16:32:08

А если я заранее выделил гигабайт памяти как говорят добрые zub и alexs и потом с ней(памятью) работаю...
заполняю, перемещаю указатель, как говорит добрый alexs... и в итоге у меня получилось пол-гигабайта строка, а памяти выделен гигабайт...
И мне эту строку - нужно отправить на сервер... :arrow: Отправится гигабайт или пол-гигабайта? :?:



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Нужна помощь Explode;

Сообщение alexs » 15.03.2014 16:39:50

при пошаговом подходе у тебя будет занято гораздо больше чем один гиг...
А на сервер отправится только столько, сколько сам отправишь. Это не связанные вещи.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Нужна помощь Explode;

Сообщение zub » 15.03.2014 22:12:58

>>А если я заранее выделил гигабайт памяти как говорят добрые zub и alexs и потом с ней(памятью) работаю...
Обычно имеется возможност посчитать сколько памяти потребуется и выделить сколько надо. Если считать лень, то можно выделить заранее с запасом и перераспределять при заполнении тоже с запасом. По окончании заполнения своей строки перераспределить по фактическому значению.

>>И непонятно, почему память автоматом правильно не выделяется при таком коде: while i < 5555555 do sMyStr := sMyStr + arrStrings[i];
>>Почему выделение памяти для стрингов - нельзя сразу в компилятор заложить?
Оно заложено в компилятор и именно по этому подход "прибавлять по символу" очень накладен. сравни время выполнения
while i < 5555555 do sMyStr := sMyStr + arrStrings[i];
и
setlength(sMyStr,5555555);
while i < 5555555 do sMySt[i]:= arrStrings[i];

>>А вот со склеиванием строк... добрые программисты утаили секреты склеивания от художников...
>>И поэтому вопрос "склеивания громадных строк" из множества маленьких - всё ещё актуален.
Главный секрет склеивания - по возможности вообще не клеить))
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Нужна помощь Explode;

Сообщение скалогрыз » 16.03.2014 02:06:02

Mirage писал(а):Зачем вообще что-то склеивать? Explode же разделяет строки?
Т.е. фактически это split(), просто неудачное название из пхпшечки зачем-то кто-то притащил.

а ведь верно! я натупил, думая про StringReplace :)

возвращаясь к теме, про explode (да! в этот раз с разделением).
прилагаю тестовый проект (наличие лазаруса не обязательно, достаточно "fpc testExp.lpr" для компиляции)
разбивает файл с 40000 записями а потом каждую на 7 ... скажем так... быстро :)
образцы тестовых файлов прилагаются.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 212

Рейтинг@Mail.ru