Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер содержимого TStrings 
:(
    Опции темы
Vit
Дата 5.2.2005, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Надо узнать размер текста в Tstrings, если размер текста измеряется десятками или сотнями мегабайт то это становится проблемой. Типичный способ length(t.text) очень медленный, поглядев в исходники VCL сделал что-то типа
Код


size:=0;
for i:=0 to t.count-1 do
 inc(size, length(t[i])+2)


работает конечно быстрее но при количестве строк в миллионы, тоже не быстро... Может есть какой-нибудь способ другой?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
SoWa
Дата 5.2.2005, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



А нельзя-ли этот код вставить в Thread, и ускорить, путем чтения не одного байта(как length), а нескольких?
Я таким образом достиг скорости копирования примерно в 1 Мб/сек.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Vit
Дата 5.2.2005, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



помещение кода в Thread не ускорит его а замедлит, и читаю я не по одному байту а по одной строке, если б я знал как читать по нескольку строк я б не спрашивал...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
RA
Дата 5.2.2005, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



А SizeOf ?
PM   Вверх
Girder
Дата 6.2.2005, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Попробуй так...
Код
var p:PChar;
//...
begin
//...
PChar(p):=PChar(t.Strings[0])-4;
Caption:=IntToStr(PDWord(p)^);
//...
end;


Это сообщение отредактировал(а) Girder - 6.2.2005, 00:27


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Vit
Дата 6.2.2005, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Цитата(RAdmin @ 5.2.2005, 12:56)
А SizeOf ?



вернёт 4 байта, размер указателя...



Girder - попробую...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 6.2.2005, 06:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Girder - нет там хранит размер только первой строки


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 6.2.2005, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



В крайнем случае можно написать свой класс, особенно если добавления элементов происходят не часто, а размер нужно часто использовать. Примерно так:

Код

 TMyStringList = class(TStringList)
 private
   FTotalLength: integer;
 protected
   procedure InsertItem(Index: Integer; const S: string; AObject: TObject); override;
 public
   constructor Create;

   procedure Delete(Index: Integer); override;
   property TotalLength: integer read FTotalLength;
 end;

{ TMyStringList }

constructor TMyStringList.Create;
begin
 inherited;
 FTotalLength := 0;
end;

procedure TMyStringList.Delete(Index: Integer);
begin
 if (Index >= 0) and (Index < Count) then
   Dec(FTotalLength, Length(Self[Index]));
 inherited;
end;

procedure TMyStringList.InsertItem(Index: Integer; const S: string;
 AObject: TObject);
begin
 inherited;
 Inc(FTotalLength, Length(S));
end;


Использование(Загоняем 100 000 000 байт):

Код

procedure TForm1.Button1Click(Sender: TObject);
var
 i, StartTime: integer;
 List: TMyStringList;
begin
 List := TMyStringList.Create;
 try
   for i := 1 to 1000000 do
     List.Add('1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111');

   StartTime := GetTickCount;

   ShowMessage(Format('Length %d, time - %d', [List.TotalLength, GetTickCount - StartTime]));
 finally
   FreeAndNil(List);
 end;
end;


В отличае от обычного TStringList тормозов не было не какихsmile Но я не смотрел все методы, возможно, что менять длину нужно еще где то(напимер, Assign стоти взглянуть)

Это сообщение отредактировал(а) <Spawn> - 6.2.2005, 12:35


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
s-mike
Дата 6.2.2005, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 9
Всего: 16



<Spawn>, это что плагиат?

http://forum.sources.ru/index.php?showtopic=82300
PM MAIL WWW   Вверх
<Spawn>
Дата 6.2.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(s @ 6.2.2005, 18:29)
<Spawn>, это что плагиат?

http://forum.sources.ru/index.php?showtopic=82300

И что? Ты этим хочешь сказать, что я скатал твой пост? Да я на тот форум вообще не захожу!


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Girder
Дата 6.2.2005, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Как показало вскрытие... smile TStrings не хранит внутри себя размер всего текста smile

Возможные пути решения:
1) Переопределить класс(или создать свой smile )и встроить подсчет размера текста
2) Если ентот список из окна... можно окну послать WM_GETTEXTLENGTH
3) Добраться до "таблицы индексации", обнаружил её только у TStringList.

Первый пример приведен выше.
Второй пример итак понятен smile

Вот пример для третьего случая (тест Delphi7):
Код
function XXX(t:TStrings):Integer;
var p:PChar;
   Size,i:integer;
begin
Size:=integer(PDWord(PChar(t.Strings[0])-4)^);
if (t.Count=1)or(Size>Length(t.Strings[0])) then
 begin
  Result:=Size;
  exit;
 end;
Size:=0;
if (t is TStringList) then
 begin
  PChar(p):=PChar(PDWord(PChar(t)+$10)^);
  for i:=0 to t.Count-1 do
   begin
    Size:=Size+PDWord(PDWord(p)^-4)^+2;
    PChar(p):=PChar(p)+8;
   end;
 end;
Result:=Size;
end;


использование:
Код
var VV:TStrings;
begin
vv:=TStringList.Create;
...
Caption:=IntToStr(XXX(vv));
...
end;




Это сообщение отредактировал(а) Girder - 6.2.2005, 22:35


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
RA
Дата 6.2.2005, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Пардо а вот такая вот функция случайно не тожесамое что и просто Length ?

Код



function SysStringLen(const S: WideString): Integer; stdcall; external 'oleaut32.dll' name 'SysStringLen';



PM   Вверх
Vit
Дата 7.2.2005, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



s-mike, <Spawn> - не сорьтесь, решение очевидное, и мне приходило в голову, и если бы брался реализовывать то скорее всего написалбы тоже самое.... Да и вообще, какой плагиат - мы тут бесплатно делимся опытом...


Кстати, s-mike, приятно видеть тебя на нашем форуме! smile
Добавлено @ 01:17
Цитата(RAdmin @ 6.2.2005, 13:59)
Пардо а вот такая вот функция случайно не тожесамое что и просто Length ?



Нет, это не туда...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.