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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2010, 14:23   #11
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Я попробовал несколькими "заумными" способами, но, как ни странно, самым быстрым оказался обычный StringList.
Код:
procedure TForm1.RzBitBtn1Click(Sender: TObject);
var sl: TStringList;
  i: Integer;
begin
  sl := TStringList.Create;
  sl.LoadFromFile('proba.txt');
  for i := 0 to sl.Count - 1 do
    sl[i] := sl[i] + ' 0 0';
  sl.SaveToFile('proba_new.txt'); //новый файл
  sl.Free;
  ShowMessage('Готово');
end;
Файл в полтора миллиона строк делает примерно за 2 сек.
_SERGEYX_ вне форума Ответить с цитированием
Старый 30.11.2010, 15:44   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

угу. попробовал. через TFileStream почти минуту обрабатывало 1.5 миллиона строк (через TStringList около 4 секунд).

зато столько же (визуально, точно тики не мерял, занял простейший код через TextFile + Readln / WriteLn
Код:
procedure TForm1.Button4Click(Sender: TObject);
var f,f2 : TextFile;
  buf  : array[1..32*1024] of byte;
  buf2 : array[1..32*1024] of byte;
  s    : shortString;
begin
  AssignFile(f,'proba.txt');
  System.SetTextBuf(f, buf);
  Reset(f);
  AssignFile(f2,'proba_new.txt');
  System.SetTextBuf(f2,buf2);
  Rewrite(f2);
  while not eof(f) do begin
     Readln(f,s);
     Writeln(f2,s + ' 0 0');
  end;
  CloseFile(f2);
  CloseFile(f);

  ShowMessage('Готово');

end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2010, 17:40   #13
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

сколько знаков каждой строке примерно? 10? 100? 1000? 10млн?)))
unbanned вне форума Ответить с цитированием
Старый 30.11.2010, 19:50   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

unbanned, а какая разница?
судя по то, что файлы 10-15 миллионов строк и размером от 40 до 200 мб - в кажой строке примерно 10-20 знаков в каждой строчке..

я считаю, что тему можно считать закрытой.
Предложено как минимум два полных и рабочих варианта. работать они должны, примерно, конечно, менее минуты...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2010, 21:35   #15
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
угу. попробовал. через TFileStream почти минуту обрабатывало 1.5 миллиона строк (через TStringList около 4 секунд).

зато столько же (визуально, точно тики не мерял, занял простейший код через TextFile + Readln / WriteLn
Код:
procedure TForm1.Button4Click(Sender: TObject);
var f,f2 : TextFile;
  buf  : array[1..32*1024] of byte;
  buf2 : array[1..32*1024] of byte;
  s    : shortString;
begin
  AssignFile(f,'proba.txt');
  System.SetTextBuf(f, buf);
  Reset(f);
  AssignFile(f2,'proba_new.txt');
  System.SetTextBuf(f2,buf2);
  Rewrite(f2);
  while not eof(f) do begin
     Readln(f,s);
     Writeln(f2,s + ' 0 0');
  end;
  CloseFile(f2);
  CloseFile(f);

  ShowMessage('Готово');

end;
я бы в цикл добавил бы
Код:
Application.ProcessMessages;
чтоб винда не закрывала программу...
и можно закрывать тему))) мне этот вариант больше нравиться...

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
unbanned, а какая разница?
просто поинтересовался, потому что если бы в каждой строке было даже по 1 млн символов, то такой вариант не подошел бы (про размеры файлов пост не увидел)

Последний раз редактировалось unbanned; 30.11.2010 в 21:39.
unbanned вне форума Ответить с цитированием
Старый 30.11.2010, 22:39   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
Application.ProcessMessages;
согласен с Вами. и, хоть это явно плохо скажет на производительности, зато очень положительно - на "отзывчивость" программы.
В реальной жизни ещё можно и статусбар или прогрессбар прикрутить. Работы на пять минут, а пользователю сразу станет лучше жить - он будет видеть, что программа делает, и сколько ещё осталось..


Цитата:
мне этот вариант больше нравиться...
ну, я бы лично рекомендовал сравнить два варианта и выбрать более подходящий. Кстати, мне лично вариант с TStringList нравится больше. Он проще визуально, да и явно не медленнее. так что, если не будет противопоказаний, то стоит использовать именно его.

Цитата:
просто поинтересовался, потому что если бы в каждой строке было даже по 1 млн символов, то такой вариант не подошел бы
ну, я бы не стал так категорически утверждать.
достаточно изменить описание s : ShortString на s : String; (по умолчанию String равен AnsiString) и всё.
можно строчки по 2 миллиарда символов читать/писать!


p.s. думаю, что тему можно будет закрывать, когда VeroStat об это скажет...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2010, 23:20   #17
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
достаточно изменить описание s : ShortString на s : String; (по умолчанию String равен AnsiString) и всё.
можно строчки по 2 миллиарда символов читать/писать!
хм...когда читается строчка из файла она ж остается в оперативке? так? в лучшем случае программе будет доступно гига 2... 2 048 * 1 024 = 2 097 152 байт... ну значит примерно столько же символов можно прочитать из файла. Т.е. если символов будет больше, тупо программе не хватит памяти
unbanned вне форума Ответить с цитированием
Старый 30.11.2010, 23:29   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
хм...когда читается строчка из файла она ж остается в оперативке? так? в лучшем случае программе будет доступно гига 2... 2 048 * 1 024 = 2 097 152 байт... ну значит примерно столько же символов можно прочитать из файла. Т.е. если символов будет больше, тупо программе не хватит памяти
программа в памяти держит всего лишь последнюю считанную строку(не думаю что она 2Гб будет)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.11.2010, 23:38   #19
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
программа в памяти держит всего лишь последнюю считанную строку(не думаю что она 2Гб будет)
именно так. дак если строчка будет длинной 2,5 млн символов, то она будет даже больше 2х гигов
unbanned вне форума Ответить с цитированием
Старый 30.11.2010, 23:40   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это очень странный txt
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
импорт из txt, работа с массивом данных, экспорт в txt Danara Microsoft Office Excel 4 31.03.2010 00:26
Повторное открытие файла txt для редактирования в delphi Shaggrath Помощь студентам 8 20.07.2009 13:36
автоматизация из ексел в txt mistx Microsoft Office Excel 23 29.01.2009 07:18
запрет редактирования AnGrig Компоненты Delphi 3 18.10.2007 11:37
Как прочесть txt файл www.site.ru/info.txt BR17UY Работа с сетью в Delphi 1 16.04.2007 13:01