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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.006 c
3-1233312359
Димон
2009-01-30 13:45
2010.01.17
ПОМОГИТЕ С ЦИКЛОМ


6-1211794870
PES
2008-05-26 13:41
2010.01.17
Почему Clientsocket на одних компах коннектится, а на других нет?


10-1162883922
Provodnick
2006-11-07 10:18
2010.01.17
Проблема с Word`ом в многопоточноми приложении


2-1257602459
Zalm
2009-11-07 17:00
2010.01.17
DSPack + WebCam


2-1259164408
Кирюшка
2009-11-25 18:53
2010.01.17
Многострочность в ValueListEditor





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