2014-10-07 1 views
0
 Public Function GenerateReportAsExcel() 
     Dim workbook = WorkbookFactory.Create(template) 
     template.Close() 
     Dim worksheet = workbook.GetSheetAt(0) 

    //   Writing record to worksheet 


     Dim workbookStream = New MemoryStream() 
     workbookStream.Flush() 
     workbookStream.Position = 0 
     workbook.Write(workbookStream) //throws error if the rocord is more then 500000...runs fine for 400000 

     Return New MemoryStream(workbookStream.ToArray()) 
    End Function 

WorkbookFactory использует NPOI.SS.UserModel ....System.OutOfMemoryException при записи, чтобы преуспеть

Есть ли способ, чтобы увеличить пропускную способность потока памяти? Я получаю System.OutOfMemoryException при записи 500000 записей в excel, но запись до 400000 отлично работает. я нашел пару подобной проблеме, но не получают никакого твердого решения этой проблемы ... Кто-то один предложил использовать

workbookStream.Flush() workbookStream.Position = 0 , но не какой-либо помощи ....

Спасибо за беспокойство ..

+0

Я вижу, что происходит какое-то копирование (похоже, что вы закончили с 3-х копиями в памяти - с фабрикой, копией, которую вы положили в 1-й поток памяти, а затем снова копией, когда вы ее переадресовываете. что-то создает мусор быстрее, чем GC может его собрать, или создавая мусор, который не может быть собран, например, не вызывать dispose, или вы работаете со структурой данных inmemory, которая просто не вписывается в пространство IIS позволяет это (что мало, например, 800 Мбайт на запрос) – MatthewMartin

+0

Насколько велик woorkBookstream, когда на 400000 записей (aka свойство Length)? – user957902

+0

Просто дай мне секунду, дайте мне проверить ... – Scorpio

ответ

1

В какой среде вы работаете? Если это 32 бит, вы получаете OutOfMemoryException в aprox. 500meg.

static void Main(string[] args) 
    { 
     var buffer = new byte[1024 * 1024]; 
     Console.WriteLine(IntPtr.Size); 
     using (var memoryStream = new MemoryStream()) 
     { 
      for (var i = 0; i < 100000000; i++) 
      { 
       try 
       { 
        memoryStream.Write(buffer, 0, 1024); 
       } 
       catch (OutOfMemoryException e) 
       { 
        Console.WriteLine("Out of memory at {0} meg", i); 
        break; 
       } 
      } 
     } 
     Console.ReadKey(); 
    } 

Если вы работаете на 64-битной ОС, убедитесь, что вы построили с выключением «Предпочитаете 32 бит». Выключите переключатель в свойствах проекта:

enter image description here

Я бы рекомендовал использовать FileStream вместо MemoryStream здесь.

0

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

workbookStream.Flush()  ' Does nothing 
    workbookStream.Position = 0 ' Does nothing 

Но остальное дело памяти. Вам нужно больше рабочей памяти (ОЗУ), чтобы делать то, что вы пытаетесь сделать. Поэтому, если вы добавляете RAM-память в машину, вам должно быть хорошо идти ... Если у вас нет 32-битной машины и не запускается в 3 ГБ оперативной памяти. В этом случае вам нужно будет перейти на 64-битную машину, где это ограничение памяти не является проблемой.

Но если вы создаете файлы Excel, вы можете захотеть взглянуть на ClosedXML вместо использования объектной модели Excel. Это библиотека, которая не требует Excel на вашем компьютере. Посмотрите на http://www.campusmvp.net/blog/generating-excel-files-like-a-pro-with-closedxml.

+0

Да, я так и думал. Я больше не использую этот код ...кто-то предложил мне ... – Scorpio

 Смежные вопросы

  • Нет связанных вопросов^_^