Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2018, 16:16   #1
Taras2018
Пользователь
 
Аватар для Taras2018
 
Регистрация: 13.01.2018
Сообщений: 47
По умолчанию Сортировка файла Delphi XE4

Сортировка файла выдает out of memory, как ускорить функцию ?
Код:
var All, f1, f2, f3: TStringList;
     i: integer;
begin

 All := TStringList.Create;
 f1 := TStringList.Create;
 f2 := TStringList.Create;
 f3 := TStringList.Create;
 All.LoadFromFile(OpenDialog1.FileName);
 for i := 0 to All.Count - 1 do
  begin
  if CheckBox1.Checked then
  begin
    if Pos(Edit1.Text, All.Strings[i]) > 0 then f1.Add(All.Strings[i]);
  end;
    if CheckBox2.Checked then
    begin
    if Pos(Edit2.Text, All.Strings[i]) > 0 then f2.Add(All.Strings[i]);
    end;
      if CheckBox3.Checked then
      begin
    if Pos(Edit3.Text, All.Strings[i]) > 0 then f3.Add(All.Strings[i]);
      end;
  end;
 All.Free;
 if CheckBox1.Checked then
 begin
 f1.SaveToFile('Organization.txt');
 end;
 if CheckBox2.Checked then
 begin
 f2.SaveToFile('Working.txt');
 end;
 if CheckBox3.Checked then
 begin
 f3.SaveToFile('Types.txt');
 end;
 f1.Free;
 f2.Free;
 f3.Free;
end;
Taras2018 вне форума Ответить с цитированием
Старый 24.02.2018, 18:29   #2
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Если файл большого объема, то в целом подход должен быть иной. В примере кода в TStringList (ALL) грузим файл..если он солидного рамерах..Out Of Memory может выпасть уже там....если,он не выпал на этом тапе...то мы продолжаем увеличивать объем потребляемой памяти создав F1,f2,f3 дублируя туда данные из All. Исправить Out Of memory можно - удалив из ALL,то что вставили в f1-f3 при условии что памяти хватило загрузить файл в ALL, если нет..то нужно либо Mapping либо на край TSringStrem.
Ускорить тут не получится..быстрее читать с TstringList ПК не станет. Высокая скорость чтения у TStreamReader
Пишу много и развернуто

Последний раз редактировалось Heneken87; 24.02.2018 в 18:43.
Heneken87 вне форума Ответить с цитированием
Старый 24.02.2018, 18:47   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
f1.Capacity:=all.Count;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.02.2018, 19:16   #4
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Для таких целей лучше использовать базу данных.

На вашем примере чтобы не было проблем с памятью для работы с большими файлами, можно работать сразу со строками этого файла без загрузки его в память.
К примеру переделанный ваш код:
Код:
var
fall, f1, f2, f3: TextFile;
S: string;
begin
//Открываем диалог выбора файла
if OpenDialog1.Execute then
begin
     AssignFile(fall, OpenDialog1.FileName);
     reset(fall);
     if CheckBox1.Checked then
     begin
     AssignFile(f1, 'Organization.txt');
     rewrite(f1);
     end;
     if CheckBox2.Checked then
     begin
     AssignFile(f2, 'Working.txt');
     rewrite(f2);
     end;
     if CheckBox3.Checked then
     begin
     AssignFile(f3, 'Types.txt');
     rewrite(f3);
     end;

//работаем по строкам в файле
while not Eof(fall) do
  begin
 //читаем строку
  ReadLn(fall, S);
  if CheckBox1.Checked and (Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(s)) > 0) then
  writeln(f1, S);
  if CheckBox2.Checked and (Pos(AnsiLowerCase(Edit2.Text), AnsiLowerCase(s)) > 0) then
  writeln(f2, S);
  if CheckBox3.Checked and (Pos(AnsiLowerCase(Edit3.Text), AnsiLowerCase(s)) > 0) then
   writeln(f3, S);
end;

CloseFile(fall);
CloseFile(f1);
CloseFile(f2);
CloseFile(f3);
end;
Еще попробуйте в Delphi увеличить лимит памяти.
Зайдите в Delphi в меню Tools -> EditorOption в закладке General в UndoLimit поставьте значение больше.

Последний раз редактировалось Aliens_wolfs; 24.02.2018 в 19:56.
Aliens_wolfs вне форума Ответить с цитированием
Старый 24.02.2018, 20:01   #5
Taras2018
Пользователь
 
Аватар для Taras2018
 
Регистрация: 13.01.2018
Сообщений: 47
По умолчанию

Heneken87, evg_m, Aliens_wolfs, Ребята спасибо большое за такую развернутую информацию, все получилось отлично.
Taras2018 вне форума Ответить с цитированием
Старый 24.02.2018, 22:09   #6
Taras2018
Пользователь
 
Аватар для Taras2018
 
Регистрация: 13.01.2018
Сообщений: 47
По умолчанию

И еще вопрос: почему выскакивает ошибка в коде от Aliens_wolfs при обработке файла: I\O error 103 ?
Taras2018 вне форума Ответить с цитированием
Старый 24.02.2018, 22:11   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Закрытие не открытого файла. Смотри как открываются и как закрываются))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.02.2018, 22:28   #8
Taras2018
Пользователь
 
Аватар для Taras2018
 
Регистрация: 13.01.2018
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Закрытие не открытого файла. Смотри как открываются и как закрываются))
А вот оно что. Благодарен Вам за подсказку. Сделал так, вроде бы работает:
Код:
CloseFile(fall);
if CheckBox1.Checked then
CloseFile(f1);
if CheckBox2.Checked then
CloseFile(f2);
if CheckBox3.Checked then
CloseFile(f3);
Taras2018 вне форума Ответить с цитированием
Старый 24.02.2018, 23:20   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Закрытие не открытого файла. Смотри как открываются и как закрываются))
Да забыл проверку открытого файла сделать на закрытие, видимо из за этого ошибка, хотя у меня Delph7 не ругается на это.
Можно оставить ваш вариант.
А можно проверку сделать так.
Код:
if TTextRec(fall).Handle > 0 then
CloseFile(fall);
if TTextRec(f1).Handle > 0 then
CloseFile(f1);
if TTextRec(f2).Handle > 0 then
CloseFile(f2);
if TTextRec(f3).Handle > 0 then
CloseFile(f3);

Последний раз редактировалось Aliens_wolfs; 24.02.2018 в 23:51.
Aliens_wolfs вне форума Ответить с цитированием
Старый 25.02.2018, 02:57   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Да забыл проверку открытого файла сделать на закрытие, видимо из за этого ошибка, хотя у меня Delph7 не ругается на это.
Врёте. Д7 точно также ругается на это.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi XE4 и формы Александр_Фролово Общие вопросы Delphi 21 02.08.2014 09:32
Delphi XE4 TXMLNodeList BidiBom Компоненты Delphi 2 14.04.2014 10:26
Delphi XE4. Formatter Larboss Общие вопросы Delphi 8 26.11.2013 10:17
Delphi XE4 Simon1712 Общие вопросы Delphi 2 14.09.2013 04:40
Открытие *.exe файла в Delphi, C++ Builder или RAD Studio XE4...!? TeleSky Помощь студентам 10 28.06.2013 12:49