На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> TStringGrid и 380000 строк , ошибка - нехватка памяти
    Может кто сталкивался. Мне нужно загнать в грид много строк данных. колонок 12. строк в данном случае чуть более 380 тисяч. В процессе возникает ошибка, которая говорит о нехватки памяти (которой 1Гб). При заполнении грид раскидывается более чем на 700Мб ОЗУ. Что делать???
      А кто выкидывает нехватку? Дельфа или Винда? По-моему в гриде есть некоторые естественные ограничения на количество элементов. Если это действительно так, то лучше юзать VirtualTreeView.
        мне нужно вивести таблице, примером 12 колонок на неизвестно сколько строк (сейчас их более 380 тисяч). Как тут поможет VirtualTreeView непонимаю :( . StringGrid - непозволяет этого сделать :( . Что можно еще использовать для организации большой таблицы?
        Сообщение отредактировано: RoboSol -
          Как раз VirtualTreeView тут и нужно юзать!

          Пусть тебя не смущает название. Это дерево может эмулировать и грид, и листвью. Скорость добавления элементов большая, использование памяти - маленькое. Зайди на http://delphi-gems.com.

          Я думаю, что он тебе более чем подойдет.

          Добавлено
          Тем более абсолютно бесплатный, с исходниками!

          Добавлено
          Прямой линк: http://www.soft-gems.net/VirtualTreeview/VT.php
            Цитата s-mike @ 10.01.05, 18:21
            По-моему в гриде есть некоторые естественные ограничения на количество элементов.

            Что то я таких не припомню..
            2автор
            Тебе нужен виртуальный грид, то есть грид, который не хранит данные в себе(как TStringGrid), а использует данные из внешнего источника(TDBGrid - типичный пример). Можешь воспользоваться либо предложенным VirtualTreeView (но тоже не самый оптимальный вариант, хотя МНОГО лудше стриггрида), либо, например, TGridView. Это очень мощный виртуальный грид, но к сожелению платный. Впрочем у меня есть очень старая бесплатная версия, если хочешь могу выслать..
              данные хранятся в массиве моего типа

              ExpandedWrap disabled
                TYPE TDataArray = record
                     FDateTime : TDateTime;
                        FPrice : DOUBLE;
                       FPatern : Integer;
                                  end;


              БД тут нет. Нужно из моего большого динамического массива отобразить таблицу (без наворотов).

              Добавлено
              И вопрос насколько надежный в работе VirtualTreeView?
                вполне надежен.
                Про БД разговора нету - DBGrid я привёл только в качестве примера.
                  Цитата RoboSol @ 10.01.05, 18:26
                  сейчас их более 380 тисяч



                  Цитата RoboSol @ 10.01.05, 19:13
                  данные хранятся в массиве моего типа

                  TYPE TDataArray = record
                  FDateTime : TDateTime;
                  FPrice : DOUBLE;
                  FPatern : Integer;
                  end;


                  Хм. А ты посчитай чуть чуть. Размер твоей записи 20 байт (8+8+4). Если таких записей у тебя 380 тысяч, то реально занимаемый ими размер памяти составляет 7 600 000 байт. Это ж почти 7.5 МБ!. Это без строкового представления которого требует StringGrid и ему подобные. С ними объем требуемой памяти возрастет в несколько раз, может даже на порядок.
                  Ты хорошенько подумай, тебе это точно надо? И если надумаешь что да, тогда крайне желательна динамическая олтрисовка!
                  И еще. Мне даже интересно увидить того человека который в состоянии оперировать таким кол-вом записей на экране - чего с ними делать-то в таком количестке?
                  Сообщение отредактировано: Петрович -
                    Статистика требует :)

                    Размер в десятки мегабайт ничуть несмущает, проблема в том что нехватает оперативки в 1 ГИГАБАЙТ! Грид с таким количеством записей просто напросто загибается :(

                    Добавлено
                    Цитата
                    И еще. Мне даже интересно увидить того человека который в состоянии оперировать таким кол-вом записей на экране - чего с ними делать-то в таком количестке?


                    мне тоже интересно увидеть этого человека :)
                    но условие есть условие.
                      Цитата Петрович @ 10.01.05, 20:13
                      надумаешь что да, тогда крайне желательна динамическая олтрисовка!

                      Вот это точно! Как раз VirtualTreeView это и делает.
                        RoboSol, выводи кусками. Например приспособь постраничный вывод.
                          При таком количестве данных (380000*12) одного гигабайта мало, наверно не хватит и 2 гб, а больше ты не можешь получить в Вин32. Да и что пользователю делать с таким количеством строк, только вешаться.
                          Решение тут в переходе на базы данных, да и то не на десктопные.

                          Можно конечно работать кусками если сумеешь обработать навигацию по таблице.
                            Базы данныз - однозначно!
                              Цитата
                              И еще. Мне даже интересно увидить того человека который в состоянии оперировать таким кол-вом записей на экране - чего с ними делать-то в таком количестке?

                              Если приходиться иметь дело со статистикой, то такому количеству записей можно и не удивляться, и не важно как приходиться оперировать, в памяти или не посредственно на каком-нибудь гриде(правда в Excel'e всего 65536 строк :) ).
                              C целью удовлетворения любопатства Петрович и RoboSol отвечаю я такой человек (то есть работаю со статистикой и с не малым количеством данных, хоть их там и не 380 тыс., но тыс. 5 и более там будет наверняка). Лично я такую проблему (сам как-то тестил прогу на не маленькое кол-во данных) возникшую у RoboSol считаю актуальной(для людей работающих со статданными).
                              Цитата
                              А кто выкидывает нехватку? Дельфа или Винда?

                              Если мне память, после всех этих попоек, не изменяет, то Delphi.

                              Цитата
                              Базы данныз - однозначно!

                              Полностью с тобой согласен.
                                Цитата Vit @ 10.01.05, 21:11
                                Базы данныз - однозначно!

                                зачем?? Чтобы иметь возможность использовать DBGrid? Смешно :-)

                                Кстати, можно вообще без сторонних компонентов обойтись. Просто используй TDrawGrid ;-)
                                  Считаю, что все-таки Vit прав. Тут еще ведь нужно подумать о скорости загрузки (!), а не только отображения.
                                    Цитата RoboSol @ 10.01.05, 20:38
                                    Размер в десятки мегабайт ничуть несмущает, проблема в том что нехватает оперативки в 1 ГИГАБАЙТ!

                                    Так не смущает, или не хватает. Я наверно неясно выразился - требования к RAM здесь в прямой зависимоти от объема данных.

                                    Цитата ALUCART @ 10.01.05, 21:44
                                    я такой человек (то есть работаю со статистикой и с не малым количеством данных, хоть их там и не 380 тыс., но тыс. 5 и более там будет наверняка).

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


                                    Цитата jack128 @ 10.01.05, 21:47
                                    Цитата (Vit @ 10.01.05 21:11)
                                    Базы данныз - однозначно!

                                    зачем?? Чтобы иметь возможность использовать DBGrid? Смешно :-)


                                    Ничуть не смешно.
                                    Во превых БД+DBGrid полностью снимет вопрос памяти и производительности при отображении. А во вторых, именно БД может обеспечить достаточно гибкий доступ к такому объему данных, с возможностью их эффекивно обработать.
                                      Цитата
                                      TStringGrid и 380000 строк

                                      Автоматически вызывает в памяти всего два слова. И слова эти - "База данных"
                                      Хороший SQL-запрос намного качественнее и быстрее будет разгребаться с этими данными, чем сам человек руками в них станет лазить...
                                        jack128 а почему именно DrawGrid? Чем StringGrid плох?
                                          Цитата ALUCART @
                                          Если приходиться иметь дело со статистикой, то такому количеству записей можно и не удивляться, и не важно как приходиться оперировать, в памяти или не посредственно на каком-нибудь гриде(правда в Excel'e всего 65536 строк :) ).

                                          Количество записей не удивляет, я например работаю с миллионами, но зачем же визуально?
                                          Я еще пойму когда это делается в Экселе, нет там другой возможности, я не рассматирваю использование VBA, но в Дельфи?
                                          Или у вас человек вручную выписывает данные на бумажку?
                                            ИМХО здесь не обязательно использовать БД, просто надо действительно сделать динамическую прокрутку, так как делает Lister в Total Commander, отображать информацию по мере прокрутки, но в гриде это сделать не так то просто, если например была произведена прокрутка на середину таблицы(к примеру) то ту информацию что была выше надо освобождать, а как?
                                              Цитата feriman @
                                              то ту информацию что была выше надо освобождать, а как?

                                              не надо освобождать. Надо читать кусками. И показывать пользователю как кадр. Правда ещё как-то скролбар надо подделать.
                                                Вот и я о том-же :) Что скролбар нодо как-то подделать 8-)
                                                  Цитата feriman @
                                                  информацию что была выше надо освобождать, а как?

                                                  Читать следующие необходимые 25 строк из источника данных.
                                                    Цитата feriman @
                                                    jack128 а почему именно DrawGrid? Чем StringGrid плох?

                                                    тем, что для отображения встриг гриде нужно переводить все эти данные в строковое представление, что очень не экономично с точки зрения памяти. А в дро гриде данные можно в динамике перевести данные в строковое представление отрисовать эту строку и тут же её уничтожить..
                                                      Очевидно самый эфективный вариант - использовать динамическую прокрутку.
                                                      А может кто поделиться почему StringGrid использует так много памяти. Эти же данные загруженные в Memo раскидаются в памяти на каких то 20-30Мб, а при гриде более чем в 30 раз больше.
                                                        Потому что там заведен TStringList на каждый ряд и колонку, так что размер данных умножается в несколько раз.
                                                          да s-mike, Virtual TreeView - оставляет хорошее впечатление.

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

                                                          Нужно создать грид размерностью 12хнеизвестно с заголовком, и добавлять туда данные в виде строк.

                                                          Подскажи пожалуйста как это реализовать программно. С меня конечно плюс пречетается :)
                                                            Работать с VirtualTreeView несложно, хотя подход довольно необычный. Даю пример проги. Если что-то будет непонятно - спрашивай.
                                                            Прикреплённый файлПрикреплённый файлVTSample.zip (2.67 Кбайт, скачиваний: 362)
                                                              Круто!!! Пробовал на 1млн строк, потом на 10млн строк - работает отменно!!!
                                                              Болоьшое человеческое спасибо.
                                                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                              0 пользователей:


                                                              Рейтинг@Mail.ru
                                                              [ Script execution time: 0,0543 ]   [ 16 queries used ]   [ Generated: 16.05.24, 05:27 GMT ]