Высокая проблема использования памяти - PullRequest
0 голосов
/ 07 сентября 2011

Я сделал приложение WPF, которое открывает файл CSV и выполняет некоторые операции, которые включают в себя создание веб-страниц и получение некоторых значений, имеющих тип long. (0-10000000)

Теперь проблема заключается в том, что при большом списке около2000 открывается, а затем использование памяти для программного обеспечения поднимается выше 700 МБ в некоторых случаях 1G.

Я шокирован, увидев это.

некоторые вещи, которые я думаю, это то, что

  1. Если каждая запись в файле csv имеет длинное значение, связанное с ним, это займет много памяти. А одна запись имеет около 10-12 столбцов, каждый из которых имеет длинный тип. Теперь, когда количество строк велико, память стреляет

  2. В коде есть определенные места, в которых есть цикл (во всех строках csv), который создает экземпляр пользовательского класса. Я подумал о том, чтобы иметь деструктор, и понял, что точка net управляет памятью автоматически.

здесь идет код для загрузки CSV

    try
    {
        StreamReader sr = new StreamReader(path,Encoding.Default);
        labelRankCheckStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate()
        {
            labelRankCheckStatus.Content = "Loading Data";
        }));

        string strline = "";
        string[] _values = null;
        int x = 0;

        while (!sr.EndOfStream)
        {
            x++;
            strline = sr.ReadLine();
            _values = strline.Split(',');
            if (x == 1)
            {
                textBoxKw1.Text = _values[12];
                textBoxKw2.Text = _values[14];
                textBoxKw3.Text = _values[16];
                textBoxKw4.Text = _values[18];
            }
            else if (x != 1)
            {
                if (_values[0] != "")
                {
                    Url info = new Url();
                    srNo++;
                    info.URL = idn.GetAscii(_values[0].ToString().Trim()); 
                    info.IsChecked = true;

                    info.TestResults = int.Parse(_values[1].Replace("%","").TrimEnd().TrimStart());

                    info.PageRank= int.Parse(_values[2]);
                    info.RelPageRank = int.Parse(_values[3].Replace("%","").TrimEnd().TrimStart());

                    info.Alexa= long.Parse(_values[4]);
                    info.RelAlexa = long.Parse(_values[5].Replace("%","").TrimEnd().TrimStart());

                    info.Links= long.Parse(_values[6]);
                    info.RelLinks = long.Parse(_values[7].Replace("%","").TrimEnd().TrimStart());

                    info.GIW= long.Parse(_values[8]);
                    info.RelGIW = long.Parse(_values[9].Replace("%","").TrimEnd().TrimStart());

                    info.GIN= long.Parse(_values[10]);
                    info.RelGIN = long.Parse(_values[11].Replace("%","").TrimEnd().TrimStart());

                    info.Kw1Indexed= long.Parse(_values[12]);
                    info.RelKw1Indexed = long.Parse(_values[13].Replace("%","").TrimEnd().TrimStart());

                    info.Kw2Indexed= long.Parse(_values[14]);
                    info.RelKw2Indexed = long.Parse(_values[15].Replace("%","").TrimEnd().TrimStart());

                    info.Kw3Indexed= long.Parse(_values[16]);
                    info.RelKw3Indexed = long.Parse(_values[17].Replace("%","").TrimEnd().TrimStart());

                    info.Kw4Indexed= long.Parse(_values[18]);
                    info.RelKw4Indexed = long.Parse(_values[19].Replace("%","").TrimEnd().TrimStart());

                    info.DKwIndexed= long.Parse(_values[20]);
                    info.RelDKwIndexed = long.Parse(_values[21].Replace("%","").TrimEnd().TrimStart());

                    info.Info= _values[22];

                    info.srNo = srNo;
                    url.Add(info);
                }

            }
            dataGrid1.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate()
            {
                dataGrid1.Columns[2].Header = "URL ( " + url.Count + " )";

                try
                {
                    if (dataGrid1.ItemsSource == null)
                        dataGrid1.ItemsSource = url;
                    else
                        dataGrid1.Items.Refresh();
                }
                catch (Exception)
                {
                }
                labelRankCheckStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate()
                {
                    labelRankCheckStatus.Content = "Done";
                }));
            }));

        }
        sr.Close();
        labelRankCheckStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate()
        {
            labelRankCheckStatus.Content = "Complete ";
        }));
    }
    catch (Exception c)
    {
        MessageBox.Show(c.Message);
    }`

1 Ответ

3 голосов
/ 07 сентября 2011

Вместо того чтобы создавать копии больших объектов в памяти, рассмотрите более функциональный подход, при котором вы передаете данные, обрабатываете их и выводите в свою базу данных по вашему выбору. Если вам нужно выполнить операции со старыми данными, вы можете использовать базу данных SQL, такую ​​как Sqlite.

Создание управляемых объектов для каждой отдельной сущности в вашей системе не требует больших затрат, большинство из них вам не понадобятся.

Конечно, если у вас много оперативной памяти, может просто оказаться, что сборщик мусора еще не утруждает себя сбором мусора, потому что память активно никому не нужна. Вполне вероятно, что вы держите ссылки на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...