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

Вниз

От чего идет подвисание программы? Работаю с большой строкой   Найти похожие ветки 

 
cukerMAN   (2009-11-20 17:07) [0]

Вот пример кода, это я формирую запросы в БД в виде текстового файла что бы потом на сайте импортировать. Обьем в стринге предположительно пару десятков гигов и где то в этом месте идет подвисание:

res.Text:=s+res.Text;
s:=res.Text;
Delete(s,length(s)-2,1);
res.Text:=s+";";
res.SaveToFile(extractfilepath(paramstr(0))+"DB.txt");

Что посоветуете сделать?


 
Игорь Шевченко ©   (2009-11-20 17:09) [1]


> Что посоветуете сделать?


Отладчик - наше все


 
clickmaker ©   (2009-11-20 17:13) [2]

> Обьем в стринге предположительно пару десятков гигов

это AnsiString? Win32?


 
Leonid Troyanovsky ©   (2009-11-20 17:13) [3]


> cukerMAN   (20.11.09 17:07)  

> файла что бы потом на сайте импортировать. Обьем в стринге
> предположительно пару десятков гигов и где то в этом месте
> идет подвисание:

Приложению доступно 2Гб, и это на все про все.

> Что посоветуете сделать?

Не работать с TMemo, особенно так: res.Text:=s+";";
а работать с файлами. TFileStream forever!

Ну, и букварь какой-нить почитать.

--
Regards, LVT.


 
cukerMAN   (2009-11-20 17:28) [4]


> это AnsiString? Win32?


s:string;
res:TStringList;

Когда обьем текста не большой то в доли секунды все генерируется, если же гигабайты то вот в этом месте зависает ... Мне интересно оно зависает на строковых функциях или же на попытке сохранить фаил??


 
clickmaker ©   (2009-11-20 17:30) [5]

> [4] cukerMAN   (20.11.09 17:28)

да непонятно другое: откуда в стринге окажется 10 гигов, если приложению всего 2 доступно. И то при самом хорошем раскладе


 
Cobalt ©   (2009-11-20 17:48) [6]

Интересно, а вот замена
Delete(s,length(s)-2,1);
на
s[length(s)-2] := s[Length(s)];
SetLength(s, Length(s)-1);


даст какой-нить выигрыш?
*на больших строках, разумеется


 
cukerMAN   (2009-11-20 17:59) [7]

А в стринглист сколько может вместится? Может вместо s:string сделать s:TStringList и оперировать s.text?


 
Leonid Troyanovsky ©   (2009-11-20 18:46) [8]


> cukerMAN   (20.11.09 17:59) [7]

> А в стринглист сколько может вместится?

2Гб.
А оперировать надо TFileStream, forever.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2009-11-20 18:50) [9]


> cukerMAN   (20.11.09 17:28) [4]

See TCopyParser also.

И букварь почитай, наконец.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2009-11-20 18:53) [10]

> cukerMAN  (20.11.2009 17:59:07)  [7]

Пока не сменишь алгоритмы, то будет хуже, как с этим предложением.
Не стоит надеяться на чудо.


 
Ухарь   (2009-11-21 11:08) [11]


> Мне интересно оно зависает на строковых функциях или же
> на попытке сохранить фаил??


это выясняется с помощью замеров, например GetTickCount после каждой операции и сравнение с начальным значением


 
cukerMAN   (2009-11-24 16:04) [12]

Сел изучать ТфаилСтрим и сразу же столкнулся с проблемой, подскажите почему такой простой пример и не работает?? Фаил создается но туда записывается какая то белеберда типа "ЬЩD " - это то что в файл записывается

procedure TForm1.Button1Click(Sender: TObject);
var s:TFileStream;s1:string;
begin
 s:=TFileStream.Create("C:/sssssss.txt", fmCreate);
 s1:="Hello test";
 s.Seek(0, soFromEnd);
 //showmessage(inttostr(SizeOf(s1)));
 s.Write(s1,SizeOf(s1));
end;


 
RWolf ©   (2009-11-24 16:06) [13]

s.Write(s1[1],Length(s1))


 
RWolf ©   (2009-11-24 16:07) [14]

для юникодных дельфей — Length(s1) умножаем на SizeOf(Char).


 
cukerMAN   (2009-11-24 16:11) [15]


> s.Write(s1[1],Length(s1))


Не понял ... Write может записать только один символ? Тогда зачем ему размер узнавать если у одного символа размер будет всегда равен 1??

И что теперь что бы записать строку то нужно делать так?

for i:=0 to lentgh(s1) do
begin
 s.Write(s1[i],1)
end;

Или я туплю? Как стринг записать?


 
RWolf ©   (2009-11-24 16:14) [16]


> Не понял ... Write может записать только один символ?

нет, предложенная конструкция запишет всю строку, начиная с 1-го символа.


 
RWolf ©   (2009-11-24 16:16) [17]


> Тогда зачем ему размер узнавать если у одного символа размер
> будет всегда равен 1??

в современных версиях Delphi размер Char — два байта.


 
cukerMAN   (2009-11-24 16:16) [18]


> s.Write(s1[1],Length(s1))


Спасибо, сделал как вы советовали и заработало! Я так понял буфер это начало откуда копировать ... То есть s1[1] говорится что копировать нужно с 1 символа. То есть можно сделать s1[3] и будет копировать с третьего символа но тогда надо Length(s1)-2 верно?


 
sniknik ©   (2009-11-24 16:16) [19]

>> s.Write(s1[1],Length(s1))
> Не понял ... Write может записать только один символ? Тогда зачем ему размер узнавать если у одного символа размер будет всегда равен 1??
показана запись строки... просто за начальный адрес указан первый элемент. в данном случае эквивалентом будет
s.Write(PChar(s1),Length(s1))
раз тебя цифры смущают...


 
cukerMAN   (2009-11-24 16:19) [20]

Спасибо большое, разобрался, все работает.


 
RWolf ©   (2009-11-24 16:22) [21]


> То есть можно сделать s1[3] и будет копировать с третьего
> символа но тогда надо Length(s1)-2 верно?

да, именно так, с поправкой на размер Char.


 
cukerMAN   (2009-11-24 16:32) [22]

Еще вопрос, а почему вот здесь:
fs.Write(res.Text,Length(res.Text));

вылетает ошибка [Error] Unit1.pas(270): Variable required

Какой переменной не хватает ему?


 
Anatoly Podgoretsky ©   (2009-11-24 16:35) [23]

> RWolf  (24.11.2009 16:16:17)  [17]

Я бы не рискнул так утверждать для UTF-16


 
sniknik ©   (2009-11-24 16:37) [24]

> Я бы не рискнул так утверждать для UTF-16
хотел сказать utf-8? т.к. 16 это юникод с фиксированной длинной char... вроде бы. :)


 
RWolf ©   (2009-11-24 16:41) [25]


> Anatoly Podgoretsky ©   (24.11.09 16:35) [23]

размер типа Char, конечно.


 
Anatoly Podgoretsky ©   (2009-11-24 16:49) [26]

> sniknik  (24.11.2009 16:37:24)  [24]

Я не ошибся когда писал, это ucs-2 с фиксированой строкой, а UTF-16 много байтный, может и четыре байта быть, поэтому и называется UTF, поддерживает 2^20 символов, а не 2^16


 
Anatoly Podgoretsky ©   (2009-11-24 16:50) [27]

> RWolf  (24.11.2009 16:41:25)  [25]

Конечно тип char - производный тип. По ангельски Generic


 
RWolf ©   (2009-11-24 17:36) [28]


> Anatoly Podgoretsky ©   (24.11.09 16:50) [27]

ясно, будем знать (я пока что с новшествами 2010 знаком понаслышке).


 
RWolf ©   (2009-11-24 17:39) [29]


> cukerMAN   (24.11.09 16:32) [22]
> Еще вопрос, а почему вот здесь:fs.Write(res.Text,Length(res.
> Text));вылетает ошибка [Error] Unit1.pas(270): Variable
> requiredКакой переменной не хватает ему?

в Write нужно передавать переменную, а не свойство.
s:=res.Text;
fs.Write(s,...);


 
Anatoly Podgoretsky ©   (2009-11-24 20:23) [30]

> RWolf  (24.11.2009 17:36:28)  [28]

Можно предположить, что с UTF-16 не придется столкнуть, поскольку последствия могут быть катастрофическими, в первую очередь по определению длины строки.


 
Демо ©   (2009-11-24 21:23) [31]


> в Write нужно передавать переменную, а не свойство.


Главное передать корректно:

fs.Write(res.Text[1],...



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

Текущий архив: 2010.01.17;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.014 c
15-1254559231
Суслик_
2009-10-03 12:40
2010.01.17
JSON в дельфи


2-1259156997
Анна
2009-11-25 16:49
2010.01.17
Событие в DBGrid или в DataSet ??


2-1259206130
koha!
2009-11-26 06:28
2010.01.17
Удобно ли использовать?


15-1258525375
snowkam
2009-11-18 09:22
2010.01.17
Данные с ММВБ


15-1257529216
Kolan
2009-11-06 20:40
2010.01.17
А как добавить tags, branches и trunc в уже существующий svn?