Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка большого кол-ва строк


Страницы:   1 2

Dmitry87 ©   (2009-02-05 01:25:00) 

Здравствуйте.
Скажите пожалуйста, как лучше реализовать следующее (я совсем новичек):
Нужно по определенному принципу обработать текстовый файл (около миллиона строк) и записать обработанные данные в StringGrid.
Реализовал следующим образом:

str:=tstringlist.create;
if opendialog1.Execute then
str.loadfromfile(opendialog1.FileName);
for c := 0 to str.Count-1 do
 begin
 str1:=str.Strings[c];
 Form2.Panel3.caption:=inttostr(c+1)+' of '+inttostr(str.Count)+' complete';
 StringGrid1.RowCount:= StringGrid1.RowCount+1;
 z:=100*c div str.Count-1;
 Form2.ProgressBar1.Position:=z;
 form2.Update;
for e := 0 to 25 do
 begin
   ind:=pos(';',str1);
   StringGrid1.Cells[e,c]:=copy(str1,0,ind-1);
   delete(str1,1,ind);
   end;
end;


Проблема: Приложение (судя по ProgressBar и счетчику обработанных строк) намертво виснет еще на 50-70 тысячах. Также виснет при деактивации окна. При этом память, используемая программой растет огромными темпами.
Вопрос: Куда копать? Конкретную реализацию мне не нужно - просто укажите что неправильно.
Cпасибо.


Dmitry87   (2009-02-05 11:33:00) [21]

А писать в Access можно, используя синтаксис Object Pascal'а (не знаю как иначе выразить мысль), или только каким нибудь SQL?


Dmitry87   (2009-02-05 11:30:00) [22]

Эксель 2007. Однако, как я выше указал, выяснил что нужно им СУБД. Просто у них есть подобная база (на Delphi), которую они называют "Excel". Выяснилось сегодня утром :).
Cпасибо.


ЮЮ   (2009-02-05 11:29:00) [23]


> Причем нужна программа (Access их не устраивает).


Access - это не только программа, которая, даже если и не устраивает их, вполне устроит тебя для разработки структуры БД.

Ассess ( точнее mdb файл, согдаваемый Access-ом) - это и есть файловая БД, работать с которой можно и не имея установленного в системе Ассess-а

Для работы смотри компоненты на вкладке ADO


Anatoly Podgoretsky   (2009-02-05 11:17:00) [24]

> Dmitry87  (05.02.2009 11:05:15)  [15]

Ты так и продолжаешь молчать, о каком Экселе идет речь?


Dmitry87   (2009-02-05 11:05:00) [25]

Здравствуйте.
Эх... Те, кто просил меня сделать ЭТО имели в виду БД, как выяснилось (просто БД для них - это "Excel"). Причем нужна программа (Access их не устраивает). "Заказ" не коммерческий, денех не дадут - я взялся для собственной практики (т.к. лучше всего учиться в "боевых условиях" или приближенным к ним). В дальнейшем в базу будут добавляться новые элементы из файлов, не только с разделителями ";" + кое-какая обработка (которую нужно организовать). Сделать нужно за 2 месяца, время есть.
879452 файла вчера прочитались и нормально записались в StringGrid.
Теперь, с вашего позволения, вопросы:
1. Как можно писать в таблицу БД программно? Что нужно изучить (что почитать)? Какую БД выбрать (как я понял их несколько видов)?

p.s. Опять же, простите за "ламеризм". Учусь :).


Anatoly Podgoretsky   (2009-02-05 10:53:00) [26]

> palva  (05.02.2009 10:41:13)  [13]

Есть, до 1 млн


palva   (2009-02-05 10:41:00) [27]

А есть версии экселя, которые на один лист смогут принять больше чем 65536 строк ?


Anatoly Podgoretsky   (2009-02-05 09:30:00) [28]

> Dmitry87  (05.02.2009 2:28:07)  [7]

Что за страна такая маленькая?
Какой версии Эксель?
Если около одного миллиона, то еще есть надежда, про время я правда не говорю.


korneley   (2009-02-05 08:13:00) [29]


>  это нужно для дальнейшего экспорта в Excel

Чего-то я не понял. Если файл с разделителями "точка с запятой", то Эксель его легко примет и без доп. действий. А обработку (если надо), можно и средствами VBA организовать. Уже в самом Экселе. К чему тут Delphi?


sniknik   (2009-02-05 07:56:00) [30]

> Вообще, по идее, это нужно для дальнейшего экспорта в Excel
Excel вообще то столько не держит, и даже не пытается.

> Отдельное огромнейшее Спасибо to Servy!
медвежья услуга... лучше прислушайся к остальным.

> Ужеобработано около 200000 строк и никаких проблем.
за сколько дней рассчитываешь завершить? а ведь миллион это вовсе даже и не много в реалиях баз данных, можно в минуты обработать.


Amoeba   (2009-02-05 03:43:00) [31]


> Уже обработано около 200000 строк и никаких проблем.

И неужели это все загружено в StringGrid? И кто будет готов этот навоз разгребать? Врагу не пожелаю.


Dmitry87   (2009-02-05 02:43:00) [32]

Отдельное огромнейшее Спасибо to Servy!
Добавление метода "Application.ProcessMessages();" полностью решило проблему. Используемая память больше не растет до невероятных размеров, окно перерисовывается, прогрессбар работает! Уже обработано около 200000 строк и никаких проблем.
Еще раз спасибо, я счастлив :).


Dmitry87   (2009-02-05 02:28:00) [33]

Огромное спасибо всем помогающим!
Вообще, по идее, это нужно для дальнейшего экспорта в Excel (может можно как-то напрямую в Excel и писать? Или и вправду писать в БД, а затем оттуда в Excel?). Такое большое кол-во строк оттого, что это была БД когда-то, со списком всех жителей страны по областям (и таких файлов штук 15).


Servy   (2009-02-05 02:11:00) [34]

> Нужно по определенному принципу обработать текстовый файл
> (около миллиона строк) и записать обработанные данные в
> StringGrid.


Бедный пользователь, которому читать потом эти "около миллиона срок". Правильное решение - пересмотреть интерфейс так, чтобы не нужно было выводить миллион строк одновременно.


> Приложение (судя по ProgressBar и счетчику обработанных
> строк) намертво виснет еще на 50-70 тысячах.

Намертво висит, судя по коду, не должно быть. То, что виндовый контрол при таком количестве текста может колбасить - в этом больших сомнений нет, но приложение должно в общем-то жить себе и поживать. Судя по

> Также виснет при деактивации окна.

Имеется в виду всего-лишь то, что приложение не отвечает на ввод/вывод и не перерисовывается. Добавление в цикл Application.ProcessMessages(); позволит заставить приложение еще и перерисовываться, и отвечать на клики мышью и другие внешние раздражители.


Dmitry87   (2009-02-05 02:09:00) [35]

ОК. Из визуальных компонент (если я правильно понимаю что это) в цикле используется только этот StringGrid и ProgressBar с панелями где отображается количество строк => их нужно исключить? Как тогда можно мониторить прогресс работы? Дело в том, что изначально не было прогрессбара и панелей - и все равно "не отвечает" было.

p.s. Извините за "недоходчивость", просто в программирование только второй день вникаю.


Германн   (2009-02-05 02:00:00) [36]


> Dmitry87   (05.02.09 01:57) [3]
>
> Спасибо.
> Если писать в таблицу БД, то это поможет?

См. [2]


Dmitry87   (2009-02-05 01:57:00) [37]

Спасибо.
Если писать в таблицу БД, то это поможет? А StringList можно оставить или нужно как-то по другому? Просто сам алгоритм действий каков - тот же или все полностью менять, используя другой способ работы с файлом?


Германн   (2009-02-05 01:55:00) [38]


> Amoeba ©   (05.02.09 01:50) [1]
>
>
> > (около миллиона строк) и записать обработанные данные
> в
> > StringGrid.
> >
>
> Жесть! Все неправильно! Такое ведь никакой StringGrid не
> выдержит. Тут только BD (= база данных) может спасти отца
> русской демократии.
>

Ну не совсем не обязательно тут пользовать БД. Главное - избежать внутри цикла использования визуальных компонент.


Amoeba   (2009-02-05 01:50:00) [39]


> ( около миллиона строк) и записать обработанные данные в
> StringGrid.
>

Жесть! Все неправильно! Такое ведь никакой StringGrid не выдержит. Тут только BD (= база данных) может спасти отца русской демократии.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо