none
Ускорить работу программы (C#, Win Forms) RRS feed

  • Вопрос

  • Здравствуйте,

    есть программа, которая обрабатывает большой текстовый файл (24-27 млн строк), работает с ним и выгружает в другой текстовик. Раньше программа работала 10-20 минут,после изменений 3-4 часа.

    До изменения:

    public class InputModel
        {
            public InputModel()
            {
                
            }
    
            public InputModel(string[] arr)
            {
                FFID = arr[1];
                PVLine = arr[4];
                PVStation = arr[2];
                PPLine = arr[5];
                PPStation = arr[3];
            }
    
            public string FFID { get; set; }
            public string PVStation { get; set; }
            public string PPStation { get; set; }
            public string PVLine { get; set; }
            public string PPLine { get; set; }
        }
    
    

    использование в Form.cs (считывание строки)

    var cLine = new InputModel(line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries));//текущая строка

    после изменений:

    класс InputModel
    
    public InputModel(string[] arr, Form1 form)
            {
                this.FFID = arr[Convert.ToInt32(form.tbFFID.Text)];
                this.PPLine = arr[Convert.ToInt32(form.tbPPLine.Text)];
                this.PPStation = arr[Convert.ToInt32(form.tbPPStation.Text)];
                this.PVLine = arr[Convert.ToInt32(form.tbPVLine.Text)];
                this.PVStation = arr[Convert.ToInt32(form.tbPVStation.Text)];
    }
    
    использование в Form.cs:
    
    var cLine = new InputModel(line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries), this);//текущая строка

    То есть теперь номера столбцов пользователь сам вводит на форме и из-за этого программа очень медленно работает.

    Как уменьшить время работы программы до 20 минут опять?

    2 декабря 2013 г. 10:46

Ответы

  • Я так понимаю строки с запросом значений из текстовых полей выполняются множество раз? Если так, то просто предварительно сохраните значения из текстовых полей в память (в переменные), а момент обработки строк берите значения из переменных, а не из текстовых полей.

    Yes, yes - am back!

    2 декабря 2013 г. 11:13
    Отвечающий
  • string	FFID, PPLine, PPStation, PVLine, PVStation, FileName = "C:\\F.txt";
    int	IFFID	= Convert.ToInt32 (tbFFID.Text),
    	IPPLine	= Convert.ToInt32 (tbPPLine.Text), 
    	IPPStation = Convert.ToInt32 (tbPPStation.Text),
    	IPVLine	= Convert.ToInt32 (tbPVLine.Text),
    	IPVStation = Convert.ToInt32 (tbPVStation.Text);
    	StreamReader r = new StreamReader (FileName);
    	while (true)
    	{	string S = r.ReadLine();
    		if (S==null) break;	// Выход по концу файла
    		string [] s = S.Split(' ','\t');
    		FFID		=	s[IFFID];
    		PPLine	=	s[IPPLine]; 
    		PPStation	=	s[IPPStation];
    		PVLine	=	s[IPVLine];
    		PVStation=	s[IPVStation];
    		Work ();
    	}
    	Finish ();



    2 декабря 2013 г. 13:08

Все ответы

  • Я так понимаю строки с запросом значений из текстовых полей выполняются множество раз? Если так, то просто предварительно сохраните значения из текстовых полей в память (в переменные), а момент обработки строк берите значения из переменных, а не из текстовых полей.

    Yes, yes - am back!

    2 декабря 2013 г. 11:13
    Отвечающий
  • string	FFID, PPLine, PPStation, PVLine, PVStation, FileName = "C:\\F.txt";
    int	IFFID	= Convert.ToInt32 (tbFFID.Text),
    	IPPLine	= Convert.ToInt32 (tbPPLine.Text), 
    	IPPStation = Convert.ToInt32 (tbPPStation.Text),
    	IPVLine	= Convert.ToInt32 (tbPVLine.Text),
    	IPVStation = Convert.ToInt32 (tbPVStation.Text);
    	StreamReader r = new StreamReader (FileName);
    	while (true)
    	{	string S = r.ReadLine();
    		if (S==null) break;	// Выход по концу файла
    		string [] s = S.Split(' ','\t');
    		FFID		=	s[IFFID];
    		PPLine	=	s[IPPLine]; 
    		PPStation	=	s[IPPStation];
    		PVLine	=	s[IPVLine];
    		PVStation=	s[IPVStation];
    		Work ();
    	}
    	Finish ();



    2 декабря 2013 г. 13:08