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

Вниз

Странности...   Найти похожие ветки 

 
RealRascal   (2003-12-17 18:37) [0]

В строку помещаю содержание текстового файла(размер - ок300кило). Затем каждое слово этой строки в динамический массив из строк(нефиксированной длины). до запуска этого процесса прога в памяти занимает 6м. после обработки 300килобайтного файла она занимает 29м. Экспериментировал с файлами ок 1 мега. Они ваще в памяти ок 100мегов занимают! Кто может объяснить?
d5,winxp


 
Fredericco   (2003-12-17 18:41) [1]

Попробуй не дин. массив а TList и сообщи о результатах.


 
panov   (2003-12-17 18:48) [2]

Нерационально с памятью работаешь...
Вот код бы посмотреть.


 
Sandman25   (2003-12-17 18:55) [3]

RealRascal © (17.12.03 18:37)

Там случайно нет такого кода?
s := "";
while не_конец_слова do
s := s + еще_один_символ;


 
Fredericco   (2003-12-17 18:56) [4]

2 Sandman25 © (17.12.03 18:55) [3]
Тоже вариант.


 
RealRascal   (2003-12-17 19:01) [5]


> Fredericco © (17.12.03 18:41) [1]
> Попробуй не дин. массив а TList и сообщи о результатах.


попробовал. при обаботке мегабайтного файла в памяти заняло 14м. Интересно, в чем причина?

> Sandman25 © (17.12.03 18:55) [3]

там есть такой:
for i от 1 до конца строки do
if s[i]-буква то temp:=temp+s[i] иначе конец слова.


 
RealRascal   (2003-12-17 19:23) [6]


> Fredericco © (17.12.03 18:56) [4]
> 2 Sandman25 © (17.12.03 18:55) [3]
> Тоже вариант.

Не понял, это что чем-то чревато? Есть другие варианты?


 
Fredericco   (2003-12-17 19:26) [7]

Попробуй так

for i от 1 до конца строки do
if s[i]-буква то begin
SetLength(Temp,High(Temp)+2);
Move(s[i],Temp[High(Temp)],1);
end иначе begin
обработка Temp;
SetLength(Temp,0)
конец слова.
end;


 
RealRascal   (2003-12-17 19:37) [8]

И еще: вариант с листбоксом почему-то аномально быстро сработал, хотя я даже прорисовку не октлючал.

> Fredericco © (17.12.03 19:26) [7]

А в чем преимущество? Не заметил особых принципиальных отличий от[5] . Имхо так дольше даже будет. В чем смысл SetLength(Temp,0), если можно написать temp:=""?


 
Fredericco   (2003-12-17 19:44) [9]

RealRascal © (17.12.03 19:37) [8]
Так ты попробывал?

Дело в том, что Дельфи хитро со строками работает.
При каждой комманде s:=s+"1" в памяти создается новая запись сначала "1" потом "11" потом "111" потом "1111" потом "1111" и т.д. А вот как это дело потом освобождается - не знаю.
И еще на будущее, строка - это дин. массив, элементы в массиве хранятся строго друг за другом, при этом каждое новое добавление элемента в массив может повлеч за собой копирование ВСЕГО массива в другой участок памяти.


 
Fredericco   (2003-12-17 19:47) [10]

В принципе код
SetLength(Temp,High(Temp)+2);
Move(s[i],Temp[High(Temp)],1);
тоже может повлечь за собой копирование всей строки Temp в другой участок памяти (на скорость, я так понял, пока жалоб нет:-)), однако лишних участков памяти так не отхапаешь.


 
Sandman25   (2003-12-18 10:26) [11]

[6] RealRascal © (17.12.03 19:23)

Не надо никакие строки в цикле изменять. В цикле надо только индексы рассчитывать.
Типа
StartIndex := 1;
EndIndex := 1;
while не_конец_слова do
Inc(EndIndex);
if слово_найдено then
begin
Massiv[IndexSlova] := Copy(S, StartIndex, EndIndex);
end;


 
RealRascal   (2003-12-27 08:12) [12]


> Sandman25 © (18.12.03 10:26) [11]

Отличный вариант. На этом и порешили.



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

Форум: "Потрепаться";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
1-63101
Unknown
2004-01-10 22:42
2004.01.20
TWinControl


4-63448
OlegV
2003-11-13 15:37
2004.01.20
Удаление выполняющегося EXE файла


14-63366
Undert
2003-12-29 16:51
2004.01.20
Где можно посмотреть таблицу альтернативных обозначений


1-63077
SMT
2004-01-08 17:57
2004.01.20
Применение процедур Canvas.TextWidth и Canvas.TextHeight


1-63244
@ndrey
2004-01-11 02:55
2004.01.20
Мастера, как отнять несколько символов от слова !!!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский