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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2014, 12:54   #1
Antony22
 
Регистрация: 10.01.2014
Сообщений: 6
По умолчанию Пожалуйста помогите оптимизировать програмку

Доброго времени суток была поставлена задача написать программу которая бы получала данные из XML файлов и записывала её в таблицу. Написать то я её собственно смог но работает она очень уж медленно скорее всего потому что функции написаны нерационально если читает файлов 20 то все нормально беда в том что надо читать 100 тысяч и более а на это уходит минут 20 а то и больше, пожалуйста подскажите как сделать это более рационально. Я новичок и программированием занимаюсь всего месяца 2 так что не суде строго пожалуйста.

Код читаемого XML:
Код:
<?xml version="1.0" encoding="utf-8" ?> 
- <report code="text" form="1212" shifr="text" year="2013" period="12" version="14-03-2014">
- <title>
  <item name="okpo" value="text" /> 
  <item name="name" value="text" /> 
  <item name="leader_fio" value="text" /> 
  <item name="responsible_post" value="text" /> 
  <item name="responsible_fio" value="text" /> 
  <item name="phone" value="text" /> 
  </title>
- <sections>
- <section code="3">
- <row code="152">
  <col code="4">4895.85</col> 
  </row>
</section>
  </sections>
  </report>
Это код функции которая читает файлы (пути получает из коллекции)
Код:
            string[] ro;
            bool flag = true; 
            ro = new string[13];
            ro[12] = ttrans;
            XmlReader xReader = XmlReader.Create(@"" + patch + "");
            try
            {
                while (xReader.Read() && flag == true)
                {
                    if ((xReader.NodeType == XmlNodeType.Element) && (xReader.Name == "report"))
                    {
                        if (xReader.HasAttributes)
                        {
                            var a = (xReader.GetAttribute("code"));
                            if (Convert.ToInt32(a.Substring(0, 1)) == 1)
                            {
                                ro[1] = a.Substring(0, 7);
                            }
                            else
                            {
                                ro[1] = a.Substring(0, 6);
                            }
                            ro[2] = (xReader.GetAttribute("year"));
                            ro[3] = (xReader.GetAttribute("period"));
                            ro[4] = (xReader.GetAttribute("version"));
                        }
                    }
                    if ((xReader.NodeType == XmlNodeType.Element) && (xReader.Name == "item"))
                    {
                        if (xReader.HasAttributes)
                        {
                            switch (xReader.GetAttribute("name"))
                            {
                                case "okpo":
                                    ro[5] = (xReader.GetAttribute("value"));
                                    break;
                                case "okpo1t":
                                    ro[5] = (xReader.GetAttribute("value"));
                                    break;
                                case "mal_vb_r":
                                    ro[5] = (xReader.GetAttribute("value"));
                                    break;
                                case "mal_vb_j":
                                    ro[5] = (xReader.GetAttribute("value"));
                                    break;
                                case "okato":
                                    ro[6] = (xReader.GetAttribute("value"));
                                    break;
                                case "name":
                                    ro[7] = (xReader.GetAttribute("value"));
                                    break;
                                case "leader_fio":
                                    ro[8] = (xReader.GetAttribute("value"));
                                    break;
                                case "responsible_post":
                                    ro[9] = (xReader.GetAttribute("value"));
                                    break;
                                case "responsible_fio":
                                    ro[10] = (xReader.GetAttribute("value"));
                                    break;
                                case "phone":
                                    ro[11] = (xReader.GetAttribute("value"));
                                    flag = false;
                                    break;
                            }
                        }
                    }
                }

                ro[0] = "" + ro[1] + "" + ro[5] + "";
               _ro = ro;
            }
            catch (Exception ex)
{
System.Windows.MessageBox.Show(string.format("Ошибка:{0}", ex));
}
Antony22 вне форума Ответить с цитированием
Старый 10.01.2014, 12:54   #2
Antony22
 
Регистрация: 10.01.2014
Сообщений: 6
По умолчанию

Эта функция вызывает предыдущую и заполняет таблицу
Код:
private void AddRows(string ttrans)
        {
            List<string> files = _files;

            for (int i = 0; i < files.Count; i++) 
            {
                ReadDocuments(files[i], ttrans);
                _dt.Rows.Add(_ro);
                try
                {
                    _dt.Rows[i][5] = Convert.ToInt64(_dt.Rows[i][5]);
                }
                catch 
                {
                    _dt.Rows[i][5] = 0;
                }
              }

            DataTable distinktTable = _dt.AsEnumerable()
                                            .GroupBy(r => r.Field<string>("id"))
                                            .Select(g => g.First())
                                            .CopyToDataTable();
            _dt.Clear();
            _dt = distinktTable.Copy();
            distinktTable.Clear();
            distinktTable.Dispose();

        }
Antony22 вне форума Ответить с цитированием
Старый 10.01.2014, 13:26   #3
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
если читает файлов 20 то все нормально беда в том что надо читать 100 тысяч и более а на это уходит минут 20 а то и большеть 100 тысяч и более а на это уходит минут 20 а то и больше
В том, что при увеличении количества файлов общее возрастает время их чтения нет ничего необычного. При постоянной вычислительной мощности, чем больше объём информации, которую необходимо обработать, тем больше времени займёт процесс обработки.
Цитата:
подскажите как сделать это более рационально
В Visual Studio имеется встроенный профилировщик. С его помощью можно исследовать программу, в частности на предмет времени выполнения функций. Это поможет найти "узкие места" и оптимизировать их.
Операция чтения всех файлов у Вас выполняется в один поток. Можно попытаться разделить нагрузку между несколькими потоками и тем самым сократить время выполнения всей операции. Особенно эффективно этот приём работает на ПК с многоядерными процессорами.
Streletz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите пожалуйста написать програмку для вычисления квадратного корня ! срочно !!! ylvia Помощь студентам 7 20.02.2012 19:29
Подкоректируйте програмку пожалуйста!!! VADOS2009-1 Помощь студентам 1 05.06.2009 01:59
помогите (подправте) програмку на С++ npizpak Помощь студентам 3 27.05.2009 16:41
Зацеите мою програмку пожалуйста. Vladya Софт 7 15.05.2009 11:39