Я работаю экономистом, но для облегчения работы прибегаю к помощи программирования. Раньше я писала макросы на VBA для Excel и Access. Потом мне дали новый компьютер, но MS Office на него не установили, сославшись на то, что покупать лицензию дорого, а Access вообще в стандартные сборки не входит. Так что специально для меня никто его покупать не будет. Предложили изучать С# и SQL-сервер, так как это единственный бесплатный вариант. Я изучила, написала приложение, но проблема в том, что оно тормозит. Я работаю с большими объемами данных. Например, есть таблица 27 столбцов х 40000 строк. Когда ее выводишь в табличную сетку (DataGridView), то она очень сильно тормозит. Я пробовала ее дробить на несколько частей, типа страниц, но это не сильно помогает, а дробить совсем мелко не имеет смысла. Я искала в гугле, оказывается у многих такая проблема, но нормального решения я не нашла. Может вы мне что-то посоветуете? Или может мне начать изучать другой язык программирования, где это получше реализовано?
Здесь Вам только про анальную бахромку ответят.
Индексы
Я не программист. Просто зашёл выразить своё восхищение бабе-программистке.
Баба-програмистка, от счастья не опписайся, что местный пустослов тебя заценил! Он по делу ничего не сказал ни разу, только оценивает ходит.
Индексы здесь не при чем. Здесь проблема не на стороне сервера, а на стороне клиента. DataGridView сам по себе тормозной элемент управления. Может быть есть способ как-то оптимизировать его работу? Или может что-то другое попробовать? Я читала, что на яве есть аналогичный контрол jTable. Мне интересно, а с ним так же все будет работать или лучше? Может мне тогда яву изучать или другой какой язык?
Я с базами данных работала о-очень давно. Если вам не ставят Microsoft Office из-за лицензии, то попросите пусть поставят Openoffice. Эта прога совершенно бесплатна, и там есть аналог аксесу в виде OpenOffice Base.
Ну или как вариант можно поискать портабл версию Microsoft Access.
Я с базами данных работала о-очень давно. Если вам не ставят Microsoft Office из-за лицензии, то попросите пусть поставят Openoffice. Эта прога совершенно бесплатна, и там есть аналог аксесу в виде OpenOffice Base.
Ну или как вариант можно поискать портабл версию Microsoft Access.
Я пробовала пользоваться портабельной версией Office, но на Win10 она не работает. К тому же использовать на работе нелец. софт незаконно. Если меня поймает сис. админ, то по головке не погладит. А в OpenOffice тоже есть VBA? Там тоже можно программировать? А то стандартная функциональность меня скорее всего не устроит.
Что именно тормозит?
Загрузка данных? Скролл? Ячейки константные или там расчеты где-то не кешируются?
+
Там вроде есть OpenOffice Basic, но он возможно отличается от vba.
А по поводу того, что у вас не работает портабл версия Access, попробуйте поискать именно портабл для Win 10, у меня при переходе на десятку тоже некоторые приложения тоже не работали. Например, автокад пришлось искать с разрядностью 64 и гораздо более новой версии чем тот, что был до этого.
Я пробовала пользоваться портабельной версией Office, но на Win10 она не работает. К тому же использовать на работе нелец. софт незаконно. Если меня поймает сис. админ, то по головке не погладит. А в OpenOffice тоже есть VBA? Там тоже можно программировать? А то стандартная функциональность меня скорее всего не устроит.
Там вроде есть OpenOffice Basic, но он возможно отличается от vba.
А по поводу того, что у вас не работает портабл версия Access, попробуйте поискать именно портабл для Win 10, у меня при переходе на десятку некоторые приложения тоже не работали. Например, автокад пришлось искать с разрядностью 64 и гораздо более новой версии чем тот, что был до этого.
Хотя, может у вас просто биндинг...
Показывайте код вашего контрола, короче, по кофейной гуще никто гадать не умеет.
В смысле код программы всей выложить? Так он большой и здесь не поместится. Если вы про источник записей, то у меня не биндинг, а пользовательский класс. Там есть поле DataTable которое формируется при создании экземпляра. Потом эта таблица разбивается на части по 5000 строк. Функция из пользовательского класса возвращает нужную таблицу, которая и служит DataSourc'ом для DataGridView.
Там вроде есть OpenOffice Basic, но он возможно отличается от vba.
А по поводу того, что у вас не работает портабл версия Access, попробуйте поискать именно портабл для Win 10, у меня при переходе на десятку некоторые приложения тоже не работали. Например, автокад пришлось искать с разрядностью 64 и гораздо более новой версии чем тот, что был до этого.
В том-то и проблема, что под 10ку ничего нет. Был бы вариант поставить виртуальную машину с хр, но у меня нет прав администратора.
В смысле код программы всей выложить? Так он большой и здесь не поместится. Если вы про источник записей, то у меня не биндинг, а пользовательский класс. Там есть поле DataTable которое формируется при создании экземпляра. Потом эта таблица разбивается на части по 5000 строк. Функция из пользовательского класса возвращает нужную таблицу, которая и служит DataSourc'ом для DataGridView.
Залейте код на любой сервис для этого, например, без кода помочь вам не получится.
Ну, разве что гадая в духе "А двойная буферизация включена?" или "А доступ к ячейкам константный?" и т.п.
Навскидку: если тормозит само отображение, можно сделать вот так:
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, делаете быстрый запрос и обновляете данные без необходимости хранить-разбивать скрытые куски.
Навскидку: если тормозит само отображение, можно сделать вот так:
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 строк? Это смешно и не удобно. Я попробую сделать двойную буферизацию, как вы говорите, но проверить это смогу только во вторник, когда выйду на работу. А так навскидку что еще можно сделать, если это не поможет?
Тормозит именно отображение. Сами по себе команды Fill и ReFill выполняются быстро. Большие таблицы, особенно одна, о которой я говорила выше, виснут при скроллинге. Я пробовала ставить вместо 5000 строк 3000, 1000, но все равно виснет. Не могу же я выводить 1000 страниц по 50 строк? Это смешно и не удобно. Я попробую сделать двойную буферизацию, как вы говорите, но проверить это смогу только во вторник, когда выйду на работу. А так навскидку что еще можно сделать, если это не поможет?
Если Fill и Refill дешёвые, то везде советуют DoubleBuffer включить.
40 тысяч строк это не очень много, разве что на постоянное разбитие можно грешить. Если не поможет, то профайлить нужно, без этого не разобраться.
На шарпе не пишу, но по опыту работы с Qt, сталкивался с медленной отрисовкой таблицы из-за выравнивания строк и столбцов. Так что советую отключить выравнивание.
P.S.: почему-то весь текст и ссылку нельзя добавить. Удачи!
Вот
Я не программист, но вуман перестает быть томным. Скоро здесь нобелевские лауреаты начнут печататься и совещания правительств по ковид проходить...
Пысы. Слушаем песню Тыжпрограммист.