![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка большого кол-ва строк
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 (= база данных) может спасти отца русской демократии.