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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с очень большим текстовым фалом. 
:(
    Опции темы
Cheburek
Дата 26.3.2006, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Ситуация:
Имееться достаточно большой файл порядка 0.5 мн строк. С ним нужно построчно прокрутить достаточно сложный алгоритм. Для этого я забиваю фаил в массив mf1[i] , где i - номер строки, по следующиму алгоритму
Код

    SetLength(mf1, l1);
    i:=0;
    WHILE NOT(EOF(F1)) DO  begin
      ReadLn(F1,mf1[i]);
      i:=i+1;
    end;

F1 - текстовой файл, l1 - кол-во строк.
Результат:
Для маленьких файлов все работает нормально, когда подставляем нужный, вместо массива строк получаем пустой массив.
Вопрос:
(В поиске признаюсь сразу не смотрел,инет тормозил smile )
Если какие-нибуть ограничения на кол-во строк при работе с файлом как с текстовым? Если да как их обойти, если нет в чем может быть проблема?

Заранее всем спасибо.


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


Эксперт
****


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

Репутация: 72
Всего: 111



А зачем тебе весь файл запихивать в массив? Это же так накладно...


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Cheburek
Дата 26.3.2006, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Yanis,

)) ладно спасибо, не подумал)) точнее подумал но не так))

хоть проблема решена а все-таки из-за чего не работало?

Это сообщение отредактировал(а) Cheburek - 26.3.2006, 01:33
PM MAIL   Вверх
Matematik
Дата 26.3.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Цитата(Cheburek @ 26.3.2006, 01:11 Найти цитируемый пост)
Если какие-нибуть ограничения на кол-во строк при работе с файлом как с текстовым?

Первый раз о таком слышу!

Не лучше использовать TStringList?
PM MAIL WWW ICQ   Вверх
Cheburek
Дата 26.3.2006, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Кстати,а чем лучше пользоваться, что бы алгоритм побыстрее написать, а то по приблезительным расчетам анализ пару часиков точно проводиться будет)) TStringList или массив?

Это сообщение отредактировал(а) Cheburek - 26.3.2006, 01:52
PM MAIL   Вверх
Matematik
Дата 26.3.2006, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Не думаю что TStringList будет очень сильно отставать в скорости от протого массива.
ИМХО TStringList удобней использовать, т.к. в него уже встроены необходимые функции для работы с массивом строк.
PM MAIL WWW ICQ   Вверх
Yanis
Дата 26.3.2006, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



Т.е. тебе нужно узнать кол-во строк в файле?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Cheburek
Дата 26.3.2006, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Yanis, э... я его знаю)))
PM MAIL   Вверх
Ciber SLasH
Дата 26.3.2006, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 67



Цитата(Cheburek @ 26.3.2006, 01:11 Найти цитируемый пост)
Имееться достаточно большой файл порядка 0.5 мн строк. С ним нужно построчно прокрутить достаточно сложный алгоритм.

Попробуй через динамический список загонять данные в память. По идеи, если память закончится, то ОСь должна в своп скидывать остатки.
PM   Вверх
Yanis
Дата 26.3.2006, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 72
Всего: 111



А твой алгоритм обязательно требует наличия всего файла целиком в памяти?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Cheburek
Дата 26.3.2006, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Ciber SLasH, Вот я это и делал, но нифига не работает..
Yanis, Нет, я думаю придеться это дело на блоки разбивать, желательно с помощью TStringList, вот вопрос как это сделать, или придеться с массивами мучиться?

PS поробовал
Код

    F1 := TStringList.Create;
    F1.LoadFromFile(Fn1);


такой же пустой список, только заметил, что в первом элементе какая-то бойда трех буквенная)) видимо компьютер меня посылает куда-то))

С менее длинными файлами по прежднему работает все отлично((

Это сообщение отредактировал(а) Cheburek - 26.3.2006, 03:26
PM MAIL   Вверх
Ciber SLasH
Дата 26.3.2006, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 67



Цитата(Cheburek @ 26.3.2006, 03:25 Найти цитируемый пост)
Ciber SLasH, Вот я это и делал, но нифига не работает..

Из первого поста этого не видно.
Может ты не понял о чём я... я имею ввиду:
Код

type
  PStringList = ^TStringList;
  TStringList = record
    ST: String;        // одна строка файла
    link: PStringList  // указатель на следующий элемент
  end;

var
  Top: Pointer = nil;        // вершина стека
  StackECount: Integer = 0;  // количество элементов стэка

{*** Добавление элемента в стек (список файлов) ***}
procedure Push(Value: String);
var
  P: PStringList;
begin
  New(P);                  // создаём новый элемент стека
  P^.ST := Value;          // заносим в поле строку файла
  if StackECount = 0 then  // если это первый элемент стэка
    P^.link := nil
  else
    P^.link := Top;        // связываем элемент с вершиной стека
  Top := P;                // перемещаем вершину стека на новый элемент
  INC(StackECount)
end;

{*** Извлечение элемента из стека (списка файлов) ***}
procedure Pop(var Value: String);
var
  P: PStringList;
begin
  P := Top;              // связываем указатель с вершиной стека
  Value := P^.ST;        // извлекаем строку файла из поля
  Top := P^.link;        // перемещаем вершину стека на один элемент ниже
  Dispose(P);            // удаляем элемент, находящийся перед вершиной стека
  DEC(StackECount)
end;

{*** Удаление элементов из стэка ***}
procedure FreeList;
var
  P: PFileList;
begin
  while Top <> nil do
  begin
    P := Top;
    Top := P^.link;
    Dispose(P)
  end
end;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
var
  ST: String;
begin
  ST := '';
  while Top <> nil do  // обход стэка
  begin
    Pop(ST);
    // действия над элементом ST
  end
end.

PM   Вверх
Демо
Дата 26.3.2006, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Cheburek,
Проверь в свой большой файл на недопустимые символы - #00, EOF...
Чудес не бывает.


--------------------
    
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 26.3.2006, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



не совсем понятно из кода, как определяешь количество строк, может здесь косяк...модет стоит стделать так:
Код
    
    WHILE NOT(EOF(F1)) DO  
      begin    
      i:=Length(mf1)+1;
      SetLength(mf1, i);    
      ReadLn(F1,mf1[i]);    
    end;
l1:=i;

или использовать tStringList


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Cheburek
Дата 26.3.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



smile
Проблема была не в длине файла)), а в кодировке(юникод smile ), после недолгих преобразований все способы зароботали...

Демо, Да, действительно чудес не бывает..
(ссори за то что голову заморочил) Всем спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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