Гость
Статьи
Программисты зайдите

Программисты зайдите

Я работаю экономистом, но для облегчения работы прибегаю к помощи программирования. Раньше я писала макросы на VBA для Excel и Access. Потом мне дали новый компьютер, но MS Office на него не установили, сославшись на то, что покупать лицензию дорого, а Access вообще в стандартные сборки не входит. Так что специально для меня никто его покупать не будет. Предложили изучать С# и SQL-сервер, так как это единственный бесплатный вариант. Я изучила, написала приложение, но проблема в том, что оно тормозит. Я работаю с большими объемами данных. Например, есть таблица 27 столбцов х 40000 строк. Когда ее выводишь в табличную сетку (DataGridView), то она очень сильно тормозит. Я пробовала ее дробить на несколько частей, типа страниц, но это не сильно помогает, а дробить совсем мелко не имеет смысла. Я искала в гугле, оказывается у многих такая проблема, но нормального решения я не нашла. Может вы мне что-то посоветуете? Или может мне начать изучать другой язык программирования, где это получше реализовано?

Автор
31 ответ
Последний — Перейти
Гость
#1

Здесь Вам только про анальную бахромку ответят.

Гость
#2

Индексы

Гость
#3

Я не программист. Просто зашёл выразить своё восхищение бабе-программистке.

Гость
#4
Гость

Индексы

Я не программист, но тоже всплыло что-то из курса SQL про индексирование .... автор, поищите про оптимизацию индексов

Гость
#5

Баба-програмистка, от счастья не опписайся, что местный пустослов тебя заценил! Он по делу ничего не сказал ни разу, только оценивает ходит.

Гость
#6

Индексы здесь не при чем. Здесь проблема не на стороне сервера, а на стороне клиента. DataGridView сам по себе тормозной элемент управления. Может быть есть способ как-то оптимизировать его работу? Или может что-то другое попробовать? Я читала, что на яве есть аналогичный контрол jTable. Мне интересно, а с ним так же все будет работать или лучше? Может мне тогда яву изучать или другой какой язык?

Гость
#7
Гость

Баба-програмистка, от счастья не опписайся, что местный пустослов тебя заценил! Он по делу ничего не сказал ни разу, только оценивает ходит.

Тебя точно не оценю, жирушка зловредная

Гость
#8

Я с базами данных работала о-очень давно. Если вам не ставят Microsoft Office из-за лицензии, то попросите пусть поставят Openoffice. Эта прога совершенно бесплатна, и там есть аналог аксесу в виде OpenOffice Base.
Ну или как вариант можно поискать портабл версию Microsoft Access.

Гость
#9
Гость

Тебя точно не оценю, жирушка зловредная

Да всем *** кого ты оценишь кого нет) как ты этого не понимаешь. ЧСВ не позволяет здраво рассуждать.

Гость
#10
Гость

Да всем *** кого ты оценишь кого нет) как ты этого не понимаешь. ЧСВ не позволяет здраво рассуждать.

И тебя не оценю, пончик злющий

Гость
#11
Гость

Я с базами данных работала о-очень давно. Если вам не ставят Microsoft Office из-за лицензии, то попросите пусть поставят Openoffice. Эта прога совершенно бесплатна, и там есть аналог аксесу в виде OpenOffice Base.
Ну или как вариант можно поискать портабл версию Microsoft Access.

Я пробовала пользоваться портабельной версией Office, но на Win10 она не работает. К тому же использовать на работе нелец. софт незаконно. Если меня поймает сис. админ, то по головке не погладит. А в OpenOffice тоже есть VBA? Там тоже можно программировать? А то стандартная функциональность меня скорее всего не устроит.

Гость
#12

Что именно тормозит?
Загрузка данных? Скролл? Ячейки константные или там расчеты где-то не кешируются?

Гость
#13
Гость

Что именно тормозит?
Загрузка данных? Скролл? Ячейки константные или там расчеты где-то не кешируются?

Вообще, код модели грида в студию, если не тролль, посмотрим.

Гость
#14
Гость

Что именно тормозит?
Загрузка данных? Скролл? Ячейки константные или там расчеты где-то не кешируются?

При скролле тормозит, зависает.

Гость
#15
Гость

Вообще, код модели грида в студию, если не тролль, посмотрим.

В смысле код модели? Что имеется в виду?

Гость
#16

+

Гость
#17

Там вроде есть OpenOffice Basic, но он возможно отличается от vba.
А по поводу того, что у вас не работает портабл версия Access, попробуйте поискать именно портабл для Win 10, у меня при переходе на десятку тоже некоторые приложения тоже не работали. Например, автокад пришлось искать с разрядностью 64 и гораздо более новой версии чем тот, что был до этого.

Гость
#18
Гость

Я пробовала пользоваться портабельной версией Office, но на Win10 она не работает. К тому же использовать на работе нелец. софт незаконно. Если меня поймает сис. админ, то по головке не погладит. А в OpenOffice тоже есть VBA? Там тоже можно программировать? А то стандартная функциональность меня скорее всего не устроит.

Там вроде есть OpenOffice Basic, но он возможно отличается от vba.
А по поводу того, что у вас не работает портабл версия Access, попробуйте поискать именно портабл для Win 10, у меня при переходе на десятку некоторые приложения тоже не работали. Например, автокад пришлось искать с разрядностью 64 и гораздо более новой версии чем тот, что был до этого.

Гость
#19
Гость

В смысле код модели? Что имеется в виду?

Хотя, может у вас просто биндинг...
Показывайте код вашего контрола, короче, по кофейной гуще никто гадать не умеет.

Гость
#20
Гость

Хотя, может у вас просто биндинг...
Показывайте код вашего контрола, короче, по кофейной гуще никто гадать не умеет.

В смысле код программы всей выложить? Так он большой и здесь не поместится. Если вы про источник записей, то у меня не биндинг, а пользовательский класс. Там есть поле DataTable которое формируется при создании экземпляра. Потом эта таблица разбивается на части по 5000 строк. Функция из пользовательского класса возвращает нужную таблицу, которая и служит DataSourc'ом для DataGridView.

Гость
#21
Гость

Там вроде есть OpenOffice Basic, но он возможно отличается от vba.
А по поводу того, что у вас не работает портабл версия Access, попробуйте поискать именно портабл для Win 10, у меня при переходе на десятку некоторые приложения тоже не работали. Например, автокад пришлось искать с разрядностью 64 и гораздо более новой версии чем тот, что был до этого.

В том-то и проблема, что под 10ку ничего нет. Был бы вариант поставить виртуальную машину с хр, но у меня нет прав администратора.

Гость
#22
Гость

В смысле код программы всей выложить? Так он большой и здесь не поместится. Если вы про источник записей, то у меня не биндинг, а пользовательский класс. Там есть поле DataTable которое формируется при создании экземпляра. Потом эта таблица разбивается на части по 5000 строк. Функция из пользовательского класса возвращает нужную таблицу, которая и служит DataSourc'ом для DataGridView.

Залейте код на любой сервис для этого, например, без кода помочь вам не получится.
Ну, разве что гадая в духе "А двойная буферизация включена?" или "А доступ к ячейкам константный?" и т.п.

Гость
#23
Гость

Хотя, может у вас просто биндинг...
Показывайте код вашего контрола, короче, по кофейной гуще никто гадать не умеет.

А контрол стандартный DataGridView. Я его никак не меняла.

Гость
#24
Гость

Залейте код на любой сервис для этого, например, без кода помочь вам не получится.
Ну, разве что гадая в духе "А двойная буферизация включена?" или "А доступ к ячейкам константный?" и т.п.

Я же говорю, никакие настройки я не меняла. Я выложила часть кода, если это поможет

Гость
#25
Гость

Я же говорю, никакие настройки я не меняла. Я выложила часть кода, если это поможет

Навскидку: если тормозит само отображение, можно сделать вот так:
public partial class myDataGridView : DataGridView
{
public myDataGridView()
{
InitializeComponent();
DoubleBuffered = true;
}
И потом использовать его. Если тормозит сам пересчёт, то без профайлера гарантировать не буду, но например можно вот так сделать:
Если у вас постраничное отображение, не нужно разбивать таблицу на подтаблицы руками каждый раз.
При инициализации сделайте SELECT * FROM foo ORDER BY id (или любой другой столбец, какой хочется) FROM 0 TO 500;
Это будут первые 500. 0 и 500 вы можете посчитать как "текущая страница минус один умножить на количество на одной странице" и "текущая страница умножить на количество на одной". Первая страница это будет 0...500, вторая - 500...1000 и так далее.
При смене страницы на следующую/предыдущую просто берёте её номер, считаете FROM TO, делаете быстрый запрос и обновляете данные без необходимости хранить-разбивать скрытые куски.

Гость
#26
Гость

Навскидку: если тормозит само отображение, можно сделать вот так:
public partial class myDataGridView : DataGridView
{
public myDataGridView()
{
InitializeComponent();
DoubleBuffered = true;
}
И потом использовать его. Если тормозит сам пересчёт, то без профайлера гарантировать не буду, но например можно вот так сделать:
Если у вас постраничное отображение, не нужно разбивать таблицу на подтаблицы руками каждый раз.
При инициализации сделайте SELECT * FROM foo ORDER BY id (или любой другой столбец, какой хочется) FROM 0 TO 500;
Это будут первые 500. 0 и 500 вы можете посчитать как "текущая страница минус один умножить на количество на одной странице" и "текущая страница умножить на количество на одной". Первая страница это будет 0...500, вторая - 500...1000 и так далее.
При смене страницы на следующую/предыдущую просто берёте её номер, считаете FROM TO, делаете быстрый запрос и обновляете данные без необходимости хранить-разбивать скрытые куски.

Тормозит именно отображение. Сами по себе команды Fill и ReFill выполняются быстро. Большие таблицы, особенно одна, о которой я говорила выше, виснут при скроллинге. Я пробовала ставить вместо 5000 строк 3000, 1000, но все равно виснет. Не могу же я выводить 1000 страниц по 50 строк? Это смешно и не удобно. Я попробую сделать двойную буферизацию, как вы говорите, но проверить это смогу только во вторник, когда выйду на работу. А так навскидку что еще можно сделать, если это не поможет?

Гость
#27
Гость

Тормозит именно отображение. Сами по себе команды Fill и ReFill выполняются быстро. Большие таблицы, особенно одна, о которой я говорила выше, виснут при скроллинге. Я пробовала ставить вместо 5000 строк 3000, 1000, но все равно виснет. Не могу же я выводить 1000 страниц по 50 строк? Это смешно и не удобно. Я попробую сделать двойную буферизацию, как вы говорите, но проверить это смогу только во вторник, когда выйду на работу. А так навскидку что еще можно сделать, если это не поможет?

Если Fill и Refill дешёвые, то везде советуют DoubleBuffer включить.
40 тысяч строк это не очень много, разве что на постоянное разбитие можно грешить. Если не поможет, то профайлить нужно, без этого не разобраться.

Гость
#28
Гость

Если Fill и Refill дешёвые, то везде советуют DoubleBuffer включить.
40 тысяч строк это не очень много, разве что на постоянное разбитие можно грешить. Если не поможет, то профайлить нужно, без этого не разобраться.

Ясно. Спасибо.

Гость
#29

На шарпе не пишу, но по опыту работы с Qt, сталкивался с медленной отрисовкой таблицы из-за выравнивания строк и столбцов. Так что советую отключить выравнивание.
P.S.: почему-то весь текст и ссылку нельзя добавить. Удачи!

Гость
#30

Вот

Гость
#31

Я не программист, но вуман перестает быть томным. Скоро здесь нобелевские лауреаты начнут печататься и совещания правительств по ковид проходить...
Пысы. Слушаем песню Тыжпрограммист.

Форум: Развлечения
Всего: 48 120 тем
Новые темы за все время: 38 152 темы
Популярные темы за все время: 17 422 темы