Текущий архив: 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.47 MB
Время: 0.011 c