Форум: "Начинающим";
Текущий архив: 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