Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

Обработка большого кол-ва строк   Найти похожие ветки 

 
Dmitry87   (2009-02-05 01:25) [0]

Здравствуйте.
Скажите пожалуйста, как лучше реализовать следующее (я совсем новичек):
Нужно по определенному принципу обработать текстовый файл (около миллиона строк) и записать обработанные данные в 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пасибо.


 
Amoeba ©   (2009-02-05 01:50) [1]


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

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


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


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

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


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

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


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


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

См. [2]


 
Dmitry87   (2009-02-05 02:09) [5]

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

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


 
Servy ©   (2009-02-05 02:11) [6]

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


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


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

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

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

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


 
Dmitry87   (2009-02-05 02:28) [7]

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


 
Dmitry87   (2009-02-05 02:43) [8]

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


 
Amoeba ©   (2009-02-05 03:43) [9]


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

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


 
sniknik ©   (2009-02-05 07:56) [10]

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

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

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


 
korneley ©   (2009-02-05 08:13) [11]


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

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


 
Anatoly Podgoretsky ©   (2009-02-05 09:30) [12]

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

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


 
palva ©   (2009-02-05 10:41) [13]

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


 
Anatoly Podgoretsky ©   (2009-02-05 10:53) [14]

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

Есть, до 1 млн


 
Dmitry87   (2009-02-05 11:05) [15]

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

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


 
Anatoly Podgoretsky ©   (2009-02-05 11:17) [16]

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

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


 
ЮЮ ©   (2009-02-05 11:29) [17]


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


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

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

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


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

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


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

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


 
Anatoly Podgoretsky ©   (2009-02-05 11:46) [20]

> Dmitry87  (05.02.2009 11:33:19)  [19]

Нельзя, язык программирования в Акцессе VBA


 
Dmitry87   (2009-02-05 12:03) [21]

> Нельзя, язык программирования в Акцессе VBA
Спасибо. Я понял. Вопрос в другом: можно ли программно писать некоторые данные из файлов в mdb на Delphi. То есть не вручную набивать или используя сам Access, а из Delph"овой программы-оболочки (данные из файлов).


 
sniknik ©   (2009-02-05 12:06) [22]

> можно ли программно писать некоторые данные из файлов в mdb на Delphi.
> ЮЮ ©   (05.02.09 11:29) [17]
??? это кому писали?


 
Anatoly Podgoretsky ©   (2009-02-05 12:10) [23]

> Dmitry87  (05.02.2009 12:03:21)  [21]

Можно и для этого не требуется программирования в Акцесс, все можно делать в прорамме на Дельфи.
Кстати я бы не советовал использовать Акцесс, возьми лучше MS SQL бесплатный - созможности много шире.


 
Dmitry87   (2009-02-05 12:54) [24]

Спасибо.
Где и как взять MS SQL? Это что? Программа? Как полностью называется или поделитесь ссылкой, будьте добры. Из моих скромных познаний знаю, что SQL - это язык запросов, вероятно им и придется оперировать для работы с БД? Пошел качать лит-ру :).


 
Плохиш ©   (2009-02-05 13:06) [25]

Интересно, это я один что-ли обратил внимание на строчку

> просто в программирование только второй день вникаю.

Учителя, блин...


 
ЮЮ ©   (2009-02-05 13:10) [26]


> Плохиш ©   (05.02.09 13:06) [25]
> Учителя, блин...


Чего осерчал? Конкуренции боишься? :)


 
Anatoly Podgoretsky ©   (2009-02-05 13:13) [27]

> Dmitry87  (05.02.2009 12:54:24)  [24]

MS это Микрософт, идешь туда м в поиске MS SQL 2005 Express
Кроме самого сервера скачиваешь еще и Bool Online + Management Studio


 
ЮЮ ©   (2009-02-05 13:15) [28]


> + Management Studio

Там есть флаконы разного объема. 50 метровый содержит и Management Studio


 
Плохиш ©   (2009-02-05 13:15) [29]


> ЮЮ ©   (05.02.09 13:10) [26]
>
>

Не, прикалываюсь, как люди любят бессмысленные телодвижения делать :-))


 
Anatoly Podgoretsky ©   (2009-02-05 13:33) [30]

> ЮЮ  (05.02.2009 13:15:28)  [28]

В Express студия и справка отдельно.


 
Dmitry87   (2009-02-05 13:34) [31]

Спасибо. Нашел где скачать.
Только вот вспомнил, что есть VS2008 на HDD. В нем случайно нет этого MSSQL? И еще есть MSSQL Server 2008 Enterprise во внутренней сети, только размер в полтора гб смущает...


 
Anatoly Podgoretsky ©   (2009-02-05 13:38) [32]

> Dmitry87  (05.02.2009 13:34:31)  [31]

VS2008 слишком широкое понятие, вероятность, что есть очень высокая.


 
korneley ©   (2009-02-06 06:48) [33]


> Те, кто просил меня сделать ЭТО имели в виду БД, как выяснилось
> (просто БД для них - это "Excel")

Непременно бежать. Желательно, в противоположную от них сторону :)


 
Dmitry87   (2009-02-06 10:45) [34]

И снова здравствуйте!  :)
немного пробежался по лит-ре по MS SQL. Как я понял, он устанавливается как набор служб, через которые и происходит доступ к БД - т.е. подключаться к БД из Delphi только через localhost?

Это значит, что при переносе БД на другой компьютер, там тоже нужно устанавлвать MS-SQL? А саму базу переносить как? Из backup"а?


 
Сергей М. ©   (2009-02-06 10:57) [35]


> т.е. подключаться к БД из Delphi только через localhost?


Не только, но предпочтительно в дан.случае.
Это касается не только и не столько MSSQL, а любого другого сервиса, предоставляющего возможность взаимодействия с ним по TCP/IP


 
Anatoly Podgoretsky ©   (2009-02-06 12:01) [36]


> Dmitry87   (06.02.09 10:45) [34]

Неверно, зависит от версии MS SQL, в 2005 сеть по определению отключена, надо специально включать. Кстати и никакого localhost тоже. Если не идет сетевое взаимодействие, то в этом режиме и должно оставаться, поскольку производительно по крайней мере на порядок выше.

Базу можно переносить по разному, либо как бекап образ, либо напрямую и подключать через attach. Первый вариант считается предпочтительным, можно переносить между разными версиями, но только вверх.

Все операции можно закодировать в Дельфи, поскольку в MS SQL нет никакого другого взаимодействия с пользователем, как через клиента, с самим сервером может идти SSMS (необязательно)


 
Dmitry87   (2009-02-06 13:00) [37]

to Anatoly Podgoretsky.

Спасибо большое. На данный момент взаимодействие с БД (по умолчанию) происходит через протокол SharedMemory...
Скажите, а можно ли сделать универсальный установочник? Ну, чтобы он сам по даблклику все развернул?
Подключение к базе делать через ADOСonnection->MS OLE DB Provider for SQL Server? А запросы и взаимодействие с БД осуществляются чере ADOQuery с помощью T-SQL запросов (например, запись в ячейки, про которую я спрашивал - через что-то типа "INSERT INTO...")?
Не подскажете ли литературу, в которой есть основы работы с SQL Server средствами Delphi? А то я что-то не то нашел, наверное ("Программирование баз данных MS SQL Server 2005. Базовый курс. Р. Виейра")...


 
sniknik ©   (2009-02-06 13:50) [38]

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

> Подключение к базе делать через ADOСonnection->MS OLE DB Provider for SQL Server?
да

> А запросы и взаимодействие с БД осуществляются чере ADOQuery
а вот этого не надо, сразу привыкай к нормальным компонентам, ADOCommand и ADODataSet.
ADOQuery, ADOTable, ADOStoredProc лучше даже удали с палитры чтобы не "соблазняли" на использование.

> Не подскажете ли литературу
самая лучшая литература это BOL (справка MSSQL, есть и русская, хотя по моему лучшая это от 2000го), и + любая книжка по основам SQL неважно какая и по какому типу, просто начать по ней.


 
Anatoly Podgoretsky ©   (2009-02-06 14:37) [39]

> Dmitry87  (06.02.2009 13:00:37)  [37]

Можно, но как сделать для 2005 не знаю, а для MSDE 2000 это или командная строка, или ИНИ файл, и то и другое можно сформировать в рантайм. Разворачивание базы делает путем запуска OSQL и текстового файла. АДО коннектион имеет свойство ConnectionString, которое тоже текстового типа. ADOQuery лучше никогда не использовать, для этого есть другие, более прямые компоненты. Литература для Дельфи просто не нужна, а для SQL сервером есть BOL



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.052 c
3-1216374027
123456711
2008-07-18 13:40
2009.03.29
получить Insert Id после запроса INSERT...


15-1232800135
ketmar
2009-01-24 15:28
2009.03.29
подскажите аналог Valgrind под винду, бесплатный


2-1233734767
snake-as
2009-02-04 11:06
2009.03.29
Сделать активным окно программы


11-1197964128
=BuckLr=
2007-12-18 10:48
2009.03.29
Проблема ListView на TabControl


2-1234175149
b@v
2009-02-09 13:25
2009.03.29
Отчет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский