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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2012, 01:55   #1
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию StringBuilder и OutOfMemoryException

Привет всем. Делаю небольшой текстовый редактор и натолкнулся на следующую проблему:
при загрузке достаточно большого файла через StringBuilder вылетает OutOfMemoryException, что логично. Но, пытаясь вызвать метод Clear() у объекта StringBuilder, вновь вылетает то же исключение. Что за дела? Не могу очистить память от большого файла.
Код:
private void OpenMenuItemClick(object sender, EventArgs e)
{
    openFileDialog.FileName = String.Empty;
    if( openFileDialog.ShowDialog() != DialogResult.OK )
        return;
    filePath = openFileDialog.FileName;
    var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    var reader = new StreamReader(fileStream, Encoding.Default);
    var buf = new StringBuilder();
    try
    {
        while(!reader.EndOfStream)
        {
            buf.AppendLine(reader.ReadLine());
        }
        textBox.Text = buf.ToString();
        var fileInfo = new FileInfo(filePath);
        Text = string.Format("{0} — TextEditor", fileInfo.Name);
    }
    catch (OutOfMemoryException)
    {
        MessageBox.Show("Недостаточно памяти для загрузки файла!", "Ошибка приложения", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message, "Ошибка приложения", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        buf.Clear();// тут - то и вылетает повторно OutOfMemoryException, если я пытался загрузить большой файл
        reader.Close();
        fileStream.Close();
    }
}

Последний раз редактировалось m9yt; 14.04.2012 в 01:59.
m9yt вне форума Ответить с цитированием
Старый 14.04.2012, 10:44   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

А насколько большой файл то??
Попробуй в конструкторе сразу задать максимальную емкость билдера.
А сколько памяти на машине?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 14.04.2012 в 10:49.
WorldMaster вне форума Ответить с цитированием
Старый 14.04.2012, 11:10   #3
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию

Файл 600 метров, на машине 3ГБ
m9yt вне форума Ответить с цитированием
Старый 14.04.2012, 11:28   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

а другими методами работать не пытались?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.04.2012, 13:07   #5
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
а другими методами работать не пытались?
Код:
if( openFileDialog.ShowDialog() == DialogResult.OK )
        string text = File.ReadAllText(openFileDialog.FileName);
Так пытался - та же история.
m9yt вне форума Ответить с цитированием
Старый 14.04.2012, 13:20   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от m9yt Посмотреть сообщение
Код:
if( openFileDialog.ShowDialog() == DialogResult.OK )
        string text = File.ReadAllText(openFileDialog.FileName);
Так пытался - та же история.
То есть вы хотите в памяти разместить все ваши 600 метров как одну строку??? Не удивительно что у вас ошибка.
Попробуйте разбить на массив строк.
Сделайте List<string> и в него сбрасывайте строки определенной фиксированой длины.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 15.04.2012, 13:33   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

m9yt

при загрузке достаточно большого файла через StringBuilder вылетает OutOfMemoryException, что логично

докупай памяти и переходи на 64-разрядную архитектуру
Rififi вне форума Ответить с цитированием
Старый 15.04.2012, 13:37   #8
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
m9yt

при загрузке достаточно большого файла через StringBuilder вылетает OutOfMemoryException, что логично

докупай памяти и переходи на 64-разрядную архитектуру
Что в этом логичного?? Налицо явно не оптимизированый код. ТС писал что у него на борту 3 гига. Просто стрингбилдер размещает данные в памяти в виде одной строки. А поскольку память фрагментирована то расположить одну строку такого объема врядли удастся.
Как выход сделать массив строк и переделать алгоритм работы.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать через stringbuilder bufalo C# (си шарп) 5 09.12.2011 19:48
System.OutOfMemoryException pancak Помощь студентам 0 08.12.2011 01:01