Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.195.107] |
|
Сообщ.
#1
,
|
|
|
Может кто сталкивался. Мне нужно загнать в грид много строк данных. колонок 12. строк в данном случае чуть более 380 тисяч. В процессе возникает ошибка, которая говорит о нехватки памяти (которой 1Гб). При заполнении грид раскидывается более чем на 700Мб ОЗУ. Что делать???
|
Сообщ.
#2
,
|
|
|
А кто выкидывает нехватку? Дельфа или Винда? По-моему в гриде есть некоторые естественные ограничения на количество элементов. Если это действительно так, то лучше юзать VirtualTreeView.
|
Сообщ.
#3
,
|
|
|
мне нужно вивести таблице, примером 12 колонок на неизвестно сколько строк (сейчас их более 380 тисяч). Как тут поможет VirtualTreeView непонимаю . StringGrid - непозволяет этого сделать . Что можно еще использовать для организации большой таблицы?
|
Сообщ.
#4
,
|
|
|
Как раз VirtualTreeView тут и нужно юзать!
Пусть тебя не смущает название. Это дерево может эмулировать и грид, и листвью. Скорость добавления элементов большая, использование памяти - маленькое. Зайди на http://delphi-gems.com. Я думаю, что он тебе более чем подойдет. Добавлено Тем более абсолютно бесплатный, с исходниками! Добавлено Прямой линк: http://www.soft-gems.net/VirtualTreeview/VT.php |
Сообщ.
#5
,
|
|
|
Цитата s-mike @ 10.01.05, 18:21 По-моему в гриде есть некоторые естественные ограничения на количество элементов. Что то я таких не припомню.. 2автор Тебе нужен виртуальный грид, то есть грид, который не хранит данные в себе(как TStringGrid), а использует данные из внешнего источника(TDBGrid - типичный пример). Можешь воспользоваться либо предложенным VirtualTreeView (но тоже не самый оптимальный вариант, хотя МНОГО лудше стриггрида), либо, например, TGridView. Это очень мощный виртуальный грид, но к сожелению платный. Впрочем у меня есть очень старая бесплатная версия, если хочешь могу выслать.. |
Сообщ.
#6
,
|
|
|
данные хранятся в массиве моего типа
TYPE TDataArray = record FDateTime : TDateTime; FPrice : DOUBLE; FPatern : Integer; end; БД тут нет. Нужно из моего большого динамического массива отобразить таблицу (без наворотов). Добавлено И вопрос насколько надежный в работе VirtualTreeView? |
Сообщ.
#7
,
|
|
|
вполне надежен.
Про БД разговора нету - DBGrid я привёл только в качестве примера. |
Сообщ.
#8
,
|
|
|
Цитата 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 и ему подобные. С ними объем требуемой памяти возрастет в несколько раз, может даже на порядок. Ты хорошенько подумай, тебе это точно надо? И если надумаешь что да, тогда крайне желательна динамическая олтрисовка! И еще. Мне даже интересно увидить того человека который в состоянии оперировать таким кол-вом записей на экране - чего с ними делать-то в таком количестке? |
Сообщ.
#9
,
|
|
|
Статистика требует
Размер в десятки мегабайт ничуть несмущает, проблема в том что нехватает оперативки в 1 ГИГАБАЙТ! Грид с таким количеством записей просто напросто загибается Добавлено Цитата И еще. Мне даже интересно увидить того человека который в состоянии оперировать таким кол-вом записей на экране - чего с ними делать-то в таком количестке? мне тоже интересно увидеть этого человека но условие есть условие. |
Сообщ.
#10
,
|
|
|
Цитата Петрович @ 10.01.05, 20:13 надумаешь что да, тогда крайне желательна динамическая олтрисовка! Вот это точно! Как раз VirtualTreeView это и делает. |
Сообщ.
#11
,
|
|
|
RoboSol, выводи кусками. Например приспособь постраничный вывод.
|
Сообщ.
#12
,
|
|
|
При таком количестве данных (380000*12) одного гигабайта мало, наверно не хватит и 2 гб, а больше ты не можешь получить в Вин32. Да и что пользователю делать с таким количеством строк, только вешаться.
Решение тут в переходе на базы данных, да и то не на десктопные. Можно конечно работать кусками если сумеешь обработать навигацию по таблице. |
Сообщ.
#13
,
|
|
|
Базы данныз - однозначно!
|
Сообщ.
#14
,
|
|
|
Цитата И еще. Мне даже интересно увидить того человека который в состоянии оперировать таким кол-вом записей на экране - чего с ними делать-то в таком количестке? Если приходиться иметь дело со статистикой, то такому количеству записей можно и не удивляться, и не важно как приходиться оперировать, в памяти или не посредственно на каком-нибудь гриде(правда в Excel'e всего 65536 строк ). C целью удовлетворения любопатства Петрович и RoboSol отвечаю я такой человек (то есть работаю со статистикой и с не малым количеством данных, хоть их там и не 380 тыс., но тыс. 5 и более там будет наверняка). Лично я такую проблему (сам как-то тестил прогу на не маленькое кол-во данных) возникшую у RoboSol считаю актуальной(для людей работающих со статданными). Цитата А кто выкидывает нехватку? Дельфа или Винда? Если мне память, после всех этих попоек, не изменяет, то Delphi. Цитата Базы данныз - однозначно! Полностью с тобой согласен. |
Сообщ.
#15
,
|
|
|
Цитата Vit @ 10.01.05, 21:11 Базы данныз - однозначно! зачем?? Чтобы иметь возможность использовать DBGrid? Смешно :-) Кстати, можно вообще без сторонних компонентов обойтись. Просто используй TDrawGrid ;-) |
Сообщ.
#16
,
|
|
|
Считаю, что все-таки Vit прав. Тут еще ведь нужно подумать о скорости загрузки (!), а не только отображения.
|
Сообщ.
#17
,
|
|
|
Цитата 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 полностью снимет вопрос памяти и производительности при отображении. А во вторых, именно БД может обеспечить достаточно гибкий доступ к такому объему данных, с возможностью их эффекивно обработать. |
Сообщ.
#18
,
|
|
|
Цитата TStringGrid и 380000 строк Автоматически вызывает в памяти всего два слова. И слова эти - "База данных" Хороший SQL-запрос намного качественнее и быстрее будет разгребаться с этими данными, чем сам человек руками в них станет лазить... |
Сообщ.
#19
,
|
|
|
jack128 а почему именно DrawGrid? Чем StringGrid плох?
|
Сообщ.
#20
,
|
|
|
Цитата ALUCART @ Если приходиться иметь дело со статистикой, то такому количеству записей можно и не удивляться, и не важно как приходиться оперировать, в памяти или не посредственно на каком-нибудь гриде(правда в Excel'e всего 65536 строк ). Количество записей не удивляет, я например работаю с миллионами, но зачем же визуально? Я еще пойму когда это делается в Экселе, нет там другой возможности, я не рассматирваю использование VBA, но в Дельфи? Или у вас человек вручную выписывает данные на бумажку? |
Сообщ.
#21
,
|
|
|
ИМХО здесь не обязательно использовать БД, просто надо действительно сделать динамическую прокрутку, так как делает Lister в Total Commander, отображать информацию по мере прокрутки, но в гриде это сделать не так то просто, если например была произведена прокрутка на середину таблицы(к примеру) то ту информацию что была выше надо освобождать, а как?
|
Сообщ.
#22
,
|
|
|
Цитата feriman @ то ту информацию что была выше надо освобождать, а как? не надо освобождать. Надо читать кусками. И показывать пользователю как кадр. Правда ещё как-то скролбар надо подделать. |
Сообщ.
#23
,
|
|
|
Вот и я о том-же Что скролбар нодо как-то подделать
|
Сообщ.
#24
,
|
|
|
Цитата feriman @ информацию что была выше надо освобождать, а как? Читать следующие необходимые 25 строк из источника данных. |
Сообщ.
#25
,
|
|
|
Цитата feriman @ jack128 а почему именно DrawGrid? Чем StringGrid плох? тем, что для отображения встриг гриде нужно переводить все эти данные в строковое представление, что очень не экономично с точки зрения памяти. А в дро гриде данные можно в динамике перевести данные в строковое представление отрисовать эту строку и тут же её уничтожить.. |
Сообщ.
#26
,
|
|
|
Очевидно самый эфективный вариант - использовать динамическую прокрутку.
А может кто поделиться почему StringGrid использует так много памяти. Эти же данные загруженные в Memo раскидаются в памяти на каких то 20-30Мб, а при гриде более чем в 30 раз больше. |
Сообщ.
#27
,
|
|
|
Потому что там заведен TStringList на каждый ряд и колонку, так что размер данных умножается в несколько раз.
|
Сообщ.
#28
,
|
|
|
да s-mike, Virtual TreeView - оставляет хорошее впечатление.
Тольку буть добр, подскажи как с ним работать, а то самому разбираться нет времени, а у тебя может опыта работы с ним побольше. Нужно создать грид размерностью 12хнеизвестно с заголовком, и добавлять туда данные в виде строк. Подскажи пожалуйста как это реализовать программно. С меня конечно плюс пречетается |
Сообщ.
#29
,
|
|
|
Работать с VirtualTreeView несложно, хотя подход довольно необычный. Даю пример проги. Если что-то будет непонятно - спрашивай.
Прикреплённый файлVTSample.zip (2.67 Кбайт, скачиваний: 362) |
Сообщ.
#30
,
|
|
|
Круто!!! Пробовал на 1млн строк, потом на 10млн строк - работает отменно!!!
Болоьшое человеческое спасибо. |