Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
56 / 56 / 10
Регистрация: 27.12.2011
Сообщений: 141
.NET 2.x

Можно ли оптимизировать функцию обработки большого количества строк

04.03.2012, 01:21. Показов 1852. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет... нужна ваша помощь. Есть функция, ей передается строка запроса к базе данных, она возвращает результат выполнения данного запроса в виде массива строк. Если результат запроса до 25000 строк, функция работает вполне шустро, но при более большом объеме данных время, отрабатываемое функцией, возрастает в геометрической прогрессии. Так при 25000 функция отрабатывает за время до 10 сек, 60000 записей / около 3-х минут, мне необходимо работать с объемом данных в 250000, она справляется за 25-30 минут, очень медленно( Подскажите как можно ускорить функцию, может использовать списки List<string> вместо массива строк. У кого какие идеи?
Вот сам код функции:


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//Функция возвращает массив с данными таблицы из Excel файла
        private string[] Get_Excel_zap(string select, string razdelitel)
        {            
            string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ExcelPath + ";Extended Properties=" + "\"Excel 12.0;HDR=YES;\"";
            ConEx = new OleDbConnection(connectionString);
            string[] temp1 = new string[] { "" };
            string[] temp2 = new string[] { "" };
            try
            {
                ConEx.Open();
                OleDbCommand Read = new OleDbCommand(select, ConEx);
                OleDbDataReader read = Read.ExecuteReader();
                string str = "";
                bool flag1 = true;
                int indx = 1;
 
                while (read.Read())
                {
                    for (int i = 0; i < read.FieldCount; i++)
                    {
                        str = str + read[i].ToString() + razdelitel;
                    }
                    if (indx == 1)
                    {
                        str = str.Remove(str.Length - razdelitel.Length);
                        temp2 = new string[] { str };
                        indx++;
                    }
                    else
                        if (flag1)
                        {
                            temp1 = new string[indx];
                            for (int i = 0; i < temp2.Length; i++)
                                temp1[i] = temp2[i];
 
                            str = str.Remove(str.Length - razdelitel.Length);
                            temp1[indx - 1] = str;
                            indx++;
                            flag1 = false;
                        }
                        else
                        {
                            temp2 = new string[indx];
                            for (int i = 0; i < temp1.Length; i++)
                                temp2[i] = temp1[i];
 
                            str = str.Remove(str.Length - razdelitel.Length);
                            temp2[indx - 1] = str;
                            indx++;
                            flag1 = true;
                        }
                    str = "";
                }
                ConEx.Close();
            }
            catch
            {
                //MessageBox.Show("Произошла ошибка соединения с базой данных!!!", "Ошибка!",        MessageBoxButtons.OK, MessageBoxIcon.Error);
                ConEx.Close();
                return new string[] { "" };
            }
 
            if (temp1.Length > temp2.Length)
            {
                return temp1;
            }
            else
            {
                return temp2;
            }
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2012, 01:21
Ответы с готовыми решениями:

Ускорение добавления большого количества строк
Доброго времени суток. Оптимизирую конвертер из одной БД в другую Суть работы конвертера Добавлено через 54 минуты Цикл по...

Автоматизировать и оптимизировать обработку большого количества данных
Есть два файла, в одном случае только форма которую надо заполнить (фаил перечень) и есть заполненная таблица (фаил список) Ребята, кому не...

помогите оптимизировать программу. Не проходит тест, из-за большого количества используемой памяти.
Пжл, помогите оптимизировать программу. Не проходит тест, из-за большого количества используемой памяти. Суть программы: Есть...

7
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
04.03.2012, 01:44
А что на выходе надо получить? while небось надолго уходит в прастрацию))) Над дополнительными потоками думал, чтобы если процессоров несколько он все занял?
0
56 / 56 / 10
Регистрация: 27.12.2011
Сообщений: 141
04.03.2012, 01:49  [ТС]
Возвращать должна то же самое, потоки не нужны думаю... мне кажется проблема в массивах temp1 и temp2... нужен другой метод сбора данных
0
87 / 85 / 10
Регистрация: 04.04.2011
Сообщений: 221
04.03.2012, 01:50
Для чего нужно так много строк загружать?
В зависимости от задачи, есть разные решения:
1. можно сделать предварительную обработку на стороне сервера?
2. можно передавать в этот метод делегат на метод, обработчик результата, тогда не нужно делать массивов - ведь на каждой строке создавать новый массив это просто убийство процессорного времени
3. можно взять Лист, а можно массивы выделять сразу большими секторами (100, 1000 элементов), тогда не нужно будет на каждой строке результата создавать новый массив
0
56 / 56 / 10
Регистрация: 27.12.2011
Сообщений: 141
04.03.2012, 01:56  [ТС]
предварительная обработка на стороне сервера отпадает, так как это не серверная БД, базой данных является файл екселя.

Добавлено через 1 минуту
shapod, насчёт делегата на метод неплохая идея, как-то неподумал... а вот третий меотд не могу понять что вы имеете ввиду... можете по подробней или пример небольшой?

Добавлено через 2 минуты
shapod, как вы считаете, по производительности Лист будет настолько быстр как и массив? или метод Add всетаки будет туговато работать?
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
04.03.2012, 01:56
Думаю проблема в проходе циклом по всем элементам результата запроса? А смотрел сколько по времени запрос выполняется? А обязательно использовать строку для возвращения результата? Нельзя вернуть коллекцию Rows?
0
87 / 85 / 10
Регистрация: 04.04.2011
Сообщений: 221
04.03.2012, 01:59
Цитата Сообщение от Караман Посмотреть сообщение
а вот третий меотд не могу понять что вы имеете ввиду... можете по подробней или пример небольшой?
Вот тут

C#
1
2
string[] temp1 = new string[] { "" };
string[] temp2 = new string[] { "" };
Сразу создать первый массив размером на 1000 строк.
И тогда первые тысяча результатов не потребуют создания нового массива и переброса данных из одного массива в другой.
Новый массив тоже делать сразу на +1000 элементов.
Если число результатов не кратно 1000 элементов, то на выходе из метода еще раз создать новый массив с новым (правильным) размером и туда закинуть уже конечный результат.

Для начала можно попробовать самый простой метод: заменить на List<string> - это самый простой для реализации. Может он и решит задачу по ускорению
1
56 / 56 / 10
Регистрация: 27.12.2011
Сообщений: 141
04.03.2012, 02:00  [ТС]
ок... спасибо... попробую эти пару методов...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2012, 02:00
Помогаю со студенческими работами здесь

Оптимизация обработки большого количества объектов
Доброго времени суток, господа. У меня есть графическая программа на основе SFML. В программе обновляются около 12-13 тысяч объектов в...

Автоматизация обработки большого количества файлов Excel
Здравствуйте Уважаемые Форумчане! Есть большое количество однотипных файлов, а именно заполненных анкет. Например, сохранено 20 анкет....

Алгоритм и структура для поиска большого количества строк в другом массиве строк
Здравствуйте! Я решаю следующую задачу: Есть файл со &quot;строками&quot; (средняя длина которых 40-50 символов) и таких строк порядка 100000....

Создать функцию для обработки символьных строк. За образец брать библиотечные функции обработки строк языка С, но не применять их в своей функции
Доброго времени суток! Крайне необходима помощь экспертов в С++! Кто может - не оставьте меня в беде))) Вот задания: 3. Создать...

Нужен софт под свои нужды с возможностью обработки большого количества txt файлов
Всем привет! Нужен софт под свои нужды с возможностью обработки большого кол-ва txt файлов (5-10к). Основное задание - корректировка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru