OutOfMemoryException при работе с большими строками
От: Mazenrab Россия http://www.electrica.ru
Дата: 04.10.11 08:12
Оценка:
Всем привет.
Столкнулся с такой ситуацией. На сайте на лету генерятся вордовские документы в формате XML и отдаются клиенту в браузер.

В нижеприведенном отрывке кода в XML-шаблон документа по меткам вставляются изображения.
И все бы ничего, но при достаточно больших изображениях получаем достаточно большие строки.
Например у меня тестовый документ потянул приблизительно на 75Mb.
При таких объемах получаю почти гарантированно OutOfMemoryException.
Собственно вопрос как с этим бороться? Вроде все что мог на StringBuilder перевел.

И второй вопрос. Заметил что на серваке вероятность получения OutOfMemoryException возрастает в зависимости от количества одновременных запросов на генерацию документа. И совершенно точно что физически на сервере память имеется и ее много. В пуле приложения ограничений на память не наблюдаю. Что это может значить?

            string fileName = String.Format("файл_{0}.doc", pOrderId);
            StringBuilder strBody = new StringBuilder();
            try
            {               
               ... 
                strBody.Append(_str_val);

                foreach (var op in query)
                {
                    int pictId = op.Field<int>("pict-id");
                    byte[] pictVal = op.Field<byte[]>("pict-val");
                    string pictType = op.Field<string>("pict-type");
                    
                    using (MemoryStream ms = new MemoryStream(pictVal))
                    {
                        using (System.Drawing.Image img = System.Drawing.Image.FromStream(ms))
                        {
                            OfficePictureWriter opw = OfficePictureWriter.Create(img, "", String.Format("{0}", pictId));
                            string pict = opw.ToString();
                            string mark = String.Format("#{0}#", pictId);
                            strBody.Replace( mark, pict );
                        }
                    }
                }
                Response.AppendHeader("Content-Type", "application/msword");
                Response.AppendHeader("Content-disposition", "attachment; filename=" + fileName);
                Response.Write(strBody.ToString());
                Response.End();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.