Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.3 c
1-63087
smu
2004-01-08 15:19
2004.01.20
Чем отличаются *.bpl и *.dcp?


11-63051
Nix
2003-05-04 18:48
2004.01.20
кол-во секций в Ini файле???


1-63238
Dimmu Borgir
2004-01-09 11:36
2004.01.20
Rgn


6-63285
Mag
2003-11-17 19:37
2004.01.20
Отправка содержимого формы по Майлу


1-63183
Zheks
2004-01-10 13:12
2004.01.20
Открытие файла на дозапись