Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Караман
56 / 56 / 10
Регистрация: 27.12.2011
Сообщений: 141
1

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

04.03.2012, 01:21. Просмотров 807. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2012, 01:21
Ответы с готовыми решениями:

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

Вставка большого количества данных
Добрый день. Не подскажете, кто какими способами заносит данные в базу MS...

Возврат большого количества данных функцией
Доброго времени суток. Вопрос такой: есть функция, которая генерирует 120...

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

Оптимизация хранения большого количества объектов в Dictionary
Добрый день. Имеется некий класс Quest и список public static...

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

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

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

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  [ТС] 8
ок... спасибо... попробую эти пару методов...
0
04.03.2012, 02:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2012, 02:00

Считывание и обработка большого количества файлов в папке
Есть задача - в папке лежит огромный массив файлов (до нескольких тысяч...

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

Алгоритм Дейкстры для большого количества точек
Здравствуйте, реализовал программу для поиска кратчайшего пути по алгоритму...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru