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

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

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

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

Сообщение vitaly_l »

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

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

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


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

Сообщение alexs »

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

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

3. Компилятор не знает - сколько в итоге тебе памяти потребуется.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

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



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

Сообщение alexs »

при пошаговом подходе у тебя будет занято гораздо больше чем один гиг...
А на сервер отправится только столько, сколько сам отправишь. Это не связанные вещи.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>А если я заранее выделил гигабайт памяти как говорят добрые 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];

>>А вот со склеиванием строк... добрые программисты утаили секреты склеивания от художников...
>>И поэтому вопрос "склеивания громадных строк" из множества маленьких - всё ещё актуален.
Главный секрет склеивания - по возможности вообще не клеить))
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

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

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

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

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