Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.08.2012, 14:25
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию Работа с большим текстовым файлом

Есть txtшник. Прога черпает из него нужный текст. Если текст в начале файла всё идёт гладко. Если текст в середине или в конце, то прога зависает, проц и озу забиваются на 100% (судя по гаджетам на windows sidebar).
Вот код:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var StrLst:TStringList;
    s,s1:AnsiString; i:byte;
begin
if not FileExists('1.txt') then
  MessageDlg('Файл не найден',mtError,[mbOk],0)
  else begin
  StrLst:=TStringlist.Create;
  StrLst.LoadFromFile('1.txt');
  s1:=Label1.Caption;
  delete(s1,1,14);
  s:=('');
  i:=0;
  while i<StrLst.Count-1 do
    if StrLst[i]='Г'+s1 then
      begin
      repeat
      inc(i);
      s:=s+StrLst[i];
      s:=s+#13#10;
      if i=StrLst.Count-1 then break;
      until(StrLst[i+1]='Г'+IntToStr(StrToInt(s1)+1));
      break;
      end
      else inc(i);
  ShowMessage(s);
  end;
end;
Думаю изменить условие if StrLst[i]='Г'+s1 на функцию i:=pos('Г'+s1,StrLst.Text).

Поможет ли это?
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #2  
Старый 12.08.2012, 15:18
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от R-18Rus
Есть txtшник. Прога черпает из него нужный текст. Если текст в начале файла всё идёт гладко. Если текст в середине или в конце, то прога зависает, проц и озу забиваются на 100% (судя по гаджетам на windows sidebar).
Зависание у тебя скорее всего тут:
Цитата:
Сообщение от R-18Rus
Код:
      s:=s+StrLst[i];
      s:=s+#13#10;
Постоянное перераспределение памяти под переменную s (с копированием старого содержимого в новое место). Чем длиннее переменная s становится, тем дольше идёт эта операция и если "клеить" нужно много строк, то вот тебе и зависание.

Цитата:
Сообщение от R-18Rus
Думаю изменить условие if StrLst[i]='Г'+s1 на функцию i:=pos('Г'+s1,StrLst.Text).

Поможет ли это?
Если правильно сделать то поможет.

И где освобождение объекта StrLst!?
Ответить с цитированием
  #3  
Старый 12.08.2012, 15:33
wendstor wendstor вне форума
Прохожий
 
Регистрация: 13.10.2010
Сообщения: 30
Репутация: 11
По умолчанию

Работать с большими текстовыми файлами лучше через stream (загрузка файла). При парсенге лучше использовать copy, pos
Ответить с цитированием
  #4  
Старый 12.08.2012, 15:45
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

стрим стриму рознь.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 12.08.2012, 15:49
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
Сообщение от poli-smen
Чем длиннее переменная s становится, тем дольше идёт эта операция и если "клеить" нужно много строк, то вот тебе и зависание.
Я и в начале файла клею много строк. Обычно надо 30-35 строк. Но с началом файла прога работает, а начиная примерно со середины (даже чуть раньше) и далее - зависает.
Освобождение не требуется потому, что, возможно, на кнопку будут нажимать не один раз. А по закрытии всей проги память итак освободится.

Цитата:
Сообщение от wendstor
Работать с большими текстовыми файлами лучше через stream (загрузка файла). При парсенге лучше использовать copy, pos
Не понял ни слова.
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #6  
Старый 12.08.2012, 16:02
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от R-18Rus
Я и в начале файла клею много строк. Обычно надо 30-35 строк. Но с началом файла прога работает, а начиная примерно со середины (даже чуть раньше) и далее - зависает.
Это легко проверить. Закомментируй те 2 строчки и попробуй открыть файл который завешивает программу.

Цитата:
Сообщение от R-18Rus
Освобождение не требуется потому, что, возможно, на кнопку будут нажимать не один раз. А по закрытии всей проги память итак освободится.
Тем более если кнопку будут нажимать не один раз (!) - 10 раз нажали на кномпку - 10 раз создался объект StrLst, а если при этом он загружал файлы по 100 мегабайт, то уже 1 гиг оперативки уже бесполезно "сожрали". Освобождать объект нужно сразу как он больше не нужен.

Цитата:
Сообщение от R-18Rus
Не понял ни слова.
Есть такой класс - TFileStream, если файлы очень большие, то лучше их не загружать целиком в TStringList, а читать почючють из TFileStream.
Ответить с цитированием
  #7  
Старый 12.08.2012, 16:12
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
Сообщение от poli-smen
акомментируй те 2 строчки и попробуй открыть файл который завешивает программу.
Файл не завешивает. По поводу тех строчек. Там производятся операции со строкой s и потом я её вывожу на экран. Зависания происходят если в строку s записывать текст из середины файла и дальше. Если текст записывать из первой половины (произвольно с какого места. и до начала второй половины максимум), то зависаний нет. Всё записывается и прекрасно выводится. При записи из второй половины или если запись была из первой и чуть-чуть из 2-й - происходит зависание, ничего на экран не выводится.

Цитата:
Сообщение от poli-smen
Тем более если кнопку будут нажимать не один раз
Да, забыл. Лето, каникулы как-никак.
__________________
Может быть, я и левша, но я всегда прав!

Последний раз редактировалось R-18Rus, 12.08.2012 в 16:15.
Ответить с цитированием
  #8  
Старый 12.08.2012, 16:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от R-18Rus
Файл не завешивает.
Т.е. если закомментировать те 2 строчки, то зависание пропадает? Значит это то, о чём я и писал.
Цитата:
Сообщение от R-18Rus
По поводу тех строчек. Там производятся операции со строкой s и потом я её вывожу на экран. Зависания происходят если в строку s записывать текст из середины файла и дальше. Если текст записывать из первой половины (произвольно с какого места. и до начала второй половины максимум), то зависаний нет. Всё записывается и прекрасно выводится. При записи из второй половины или если запись была из первой и чуть-чуть из 2-й - происходит зависание, ничего на экран не выводится.
А каким размером эти файлы (которые зевешивают), и сколько в них строчек?
Ответить с цитированием
  #9  
Старый 12.08.2012, 16:26
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Сам файл не виноват. Вы видимо что-то недопонимаете. Файл один, весит 68 kb, 822 строки.
__________________
Может быть, я и левша, но я всегда прав!

Последний раз редактировалось R-18Rus, 12.08.2012 в 16:29.
Ответить с цитированием
  #10  
Старый 12.08.2012, 16:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от R-18Rus
Сам файл не виноват. Вы видимо что-то недопонимаете. Файл один, весит 68 kb, 822 строки.
Чувак, блин! Ты наверно издеваешься? Смотри в своём коде:
Код:
var  i:byte;
У тебя в файле 822 строки, а какое максимальное число для типа Byte?
Не нужно экономить на переменной цикла, всегда (ну почти всегда) пиши:
Код:
i: Integer;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
R-18Rus (12.08.2012)
  #11  
Старый 12.08.2012, 16:48
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А что значит вот это:
Код:
...
s:=('');
...
как то странно.

Да, и всё же поменяй
Код:
...
s:=s+StrLst[i];
s:=s+#13#10;
...
на
Код:
s:=s+StrLst[i]+#13#10;
так будет проще.
Ответить с цитированием
  #12  
Старый 12.08.2012, 16:49
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Это реально была ошибка типа данных. Но почему же не было никаких warningov и errov типа выход за границы диапозона типа byte?
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #13  
Старый 12.08.2012, 16:50
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
Сообщение от Alegun
А что значит вот это
Это меня учат всегда обнулять переменные.
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
  #14  
Старый 12.08.2012, 16:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Я про скобки, строка обычно обнуляется так: s:='';
Ответить с цитированием
  #15  
Старый 12.08.2012, 16:57
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Ну скобки это уже личная отсебятина.
__________________
Может быть, я и левша, но я всегда прав!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter