Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2021, 13:03   #1
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию Потоки ,память, рассуждения

Доброго времени суток профессионалы!
Тема скорее для обсуждения, лично по мне она интересная.
Задача - создать компонент "таблица" с большой масштабируемостью.
Под масштабом понимается 100-200 колонок от 100 тыс до 500 тыс строк. Это основная задача, второстепенная это удобная навигация и отображение данных в самом компоненте(тут вопросов нет).

Естественно в память приложения такой объем данных не влезет, вторым моментом является то, что таблица должна работать как с БД напрямую для Windows, так и получать данные в JSON для платформ Android и IOS. Получить такой объем данных сразу, задача так же утыкается в память.

На вопрос зачем это надо, отвечу сразу. Специфика работы организации. Нет явно определенных критериев для выборки,а кол-во сущностей необходимых для работы исчисляется миллионами. Да и вообще, если взяться что-то писать, то это должно работать в любых условиях без каких то жестких ограничений.

Отталкиваясь от минимума,считаем что у нас 32 битная архитектура, поэтому в распоряжении максимум 1 гб памяти, остальное оставим на само приложение.

Примерная реализация:
1- На первом этапе получить из БД только ID и уложить их в упорядоченный по возрастанию массив INTEGER. - тут сразу можно получить Out OF Memory, если ИД слишком много, проблему можно обойти, если получить файл и сохранить его локально, чтобы можно было маппить.
2 - Условно разбить полученный массив на блоки (по 10-20 тыс в блоке)
3 - Создать для каждого блока поток и получить из БД необходимые данные в соответствии с их ID,далее либо парсить данные и сохранять в файл локально либо оставить жить в потоке
4 - Создать полосу прокрутки с MIN 0 и MAX = Length(массива пункта 1) - 1
5 - Создать визуальный компонент, от TControl (FMX)или TreeView, но тут не важно, можно даже TListBox(FMX), кол-во строк будет ровно столько, сколько помещается в отведенную под компонент область.
6 - Зная диапазон блока и положение скролла, для отображения информации использовать нужный блок находящийся в потоке или области чтения(если работа с файлом).

Я не работал с потоками в таких объемах. И главный вопрос состоит в следующем, если каждый поток займет примерно по 500 МБ памяти, то получу лия OutOfMemory на 3-4 потоке? Если вывалиться, то выходом будет являться парсинг и сохранение его в единый файл, JSON,XML и.т.д. хоть свой формат, это не принципиально, для этого и 1 потока будет достаточно, только ради того, чтобы не висла ПО. А вывод информации уже построить через маппинг файла хранящегося локально.
Если у кого то есть идеи или вы уже реализовывали что-то подобное, прошу поделиться опытом.
СПАСИБО!

P/S: Варианты на подобии лаб куба или проработка гибкого интерфейса для пользователя в направлении (укажи условие, выбери значение, нажми показать) не подойдут. Сама таблица будет не плоской, она призвана отражать достаточно глубокую древовидную структуру в удобоваримом для глаз формате. Разворачивающиеся списки, расшифровка кодов, если значение в ячейке относиться к справочнику, изображения ,вложения и.т.д. ИЗ БД нужно получить абсолютно все, не обращая внимание надо это пользователю или нет. Потому что сегодня ему НЕ надо, а завтра запонадобилось. Будет иметь возможность фильтрации точно. Сама таблица будет работать с разными СУБД. FireBird,MsSQl, Oracle. По факту, подобная таблица это 70% всей ПО, и ее создание решает кучу проблем и экономит просто огромное кол-во времени при разработке кроссплатформенных приложений, потому что просто надоело на каждый чих что то ваять с 0.
КОГО ПОДОБНАЯ ИДЕЯ ЗАИНТЕРЕСОВАЛА, ПРОШУ ОТПИСАТЬ,ПОДЕЛИТЬСЯ ОПЫТОМ И ОКАЗАТЬ СОДЕЙСТВИЕ. ФРОНТ И БЕКЭНДЫ ОТЗОВИТЕСЬ!)) ЕСЛИ ВСЕ ПОЙДЕТ ХОРОШО, ГОТОВЫЙ К УСТАНОВКЕ КОМПОНЕНТ МОЖНО ВЫЛОЖИТЬ ТУТ, ЧТОБЫ ВСЕ ПОЛЬЗОВАЛИСЬ! ЕЩЕ РАЗ СПАСИБО!
Пишу много и развернуто

Последний раз редактировалось Heneken87; 30.01.2021 в 14:20.
Heneken87 вне форума Ответить с цитированием
Старый 08.02.2021, 10:52   #2
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Жаль нет откликов, тему стоит закрыть. Все соло сделаю.
Пишу много и развернуто
Heneken87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рассуждения по такой задумке социального проекта Illusiony Свободное общение 8 25.06.2018 02:42
Записать следующее рассуждения в виде последовательности формул логики высказываний svich Помощь студентам 0 16.01.2014 00:52
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
Рассуждения о числе 0,(9) от скуки и понимания ущербности всех стандартов Fainder Свободное общение 63 06.09.2013 19:09
2 проги на С++, потоки и разделяемая память. Salec Фриланс 1 12.06.2013 18:28