Форум: "Начинающим";
Текущий архив: 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.05 c