2014-11-06 16 views
6

Lỗi ngoại lệ của bộ nhớ hệ thống. Tôi thấy luồng bộ nhớ chỉ bị xóa khi được lưu. Chúng tôi có 1,5 - 2GB bộ dữ liệu.Vấn đề về bộ dữ liệu lớn EPPlus với ngoại lệ ngoài bộ nhớ

Tôi đang sử dụng EPPlus Phiên bản 3.1.3.0

Chúng tôi làm như sau trong mã.

Chúng tôi vòng qua

 --> Create a Package 
     --> each table in the datareader 
      --> Add WorkSheet to the Package 
     --> Dispose Each table. 
    --> Save the Package. 

Mỗi DataTable là một Kích 300mg lên đến 15 Bàn ra hình thành hệ thống.

Điều này gây ra một vấn đề, tôi đã đăng nhập này một cách chi tiết @https://epplus.codeplex.com/workitem/15085

tôi vẫn muốn để có thể sử dụng EPPlus API rất tốt đẹp của nó. nhưng có cách nào tốt hơn để giải phóng một bảng tính một khi chúng ta thêm nó vào gói.

Cảm ơn bạn đã trợ giúp.

Trả lời

7

Thật không may, điều này có vẻ là một hạn chế lớn của EPPlus - bạn có thể tìm thấy những người khác đăng bài trên trang codeplex của họ. Tôi gặp vấn đề tương tự khi xuất tập dữ liệu lớn - các bảng đơn có chiều rộng 115+ cột và cao 60K + hàng. Thông thường khoảng 30 đến 35k hàng là khi nó hết bộ nhớ. Điều gì đang xảy ra là mỗi tế bào được tạo ra là nó sở hữu đối tượng đó là tốt cho tập dữ liệu nhỏ nhưng trong trường hợp của tôi nó sẽ là 115x60K = ~ 7 triệu. Vì mỗi ô là một đối tượng có nội dung (chủ yếu là chuỗi), dấu vết bộ nhớ của nó tăng nhanh.

Tại một thời điểm nào đó trong tương lai, kế hoạch của tôi là tạo tệp XML theo cách thủ công bằng cách sử dụng Linq2Xml. Một xlsx chỉ là một tệp zip được đổi tên thành các tệp XML tạo nên nội dung của sổ làm việc và trang tính. Vì vậy, bạn có thể tạo một xlsx trống bằng cách sử dụng EPP, lưu nó, mở nó như là một zip, kéo ra sheet1.xml và thêm nội dung dữ liệu thông qua thao tác chuỗi. Bạn cũng sẽ phải làm việc trên tệp sharedstring.xml mà Excel sử dụng để giúp giảm kích thước tệp. Có thể có các tệp xml khác cần cập nhật cũng như với các phím hoặc tên.

Nếu bạn đổi tên bất kỳ xlx nào thành đuôi .zip, bạn có thể thấy điều này.

Ví dụ sheet1.xml:

Simple Excel File Example

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"> 
    <dimension ref="A1:C2"/> 
    <sheetViews> 
     <sheetView tabSelected="1" workbookViewId="0"> 
      <selection activeCell="C5" sqref="C5"/> 
     </sheetView> 
    </sheetViews> 
    <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/> 
    <sheetData> 
     <row r="1" spans="1:3" x14ac:dyDescent="0.25"> 
      <c r="A1" t="s"> 
       <v>0</v> 
      </c><c r="B1" t="s"> 
       <v>1</v> 
      </c><c r="C1" t="s"> 
       <v>0</v> 
      </c> 
     </row> 
     <row r="2" spans="1:3" x14ac:dyDescent="0.25"> 
      <c r="A2" t="s"> 
       <v>1</v> 
      </c><c r="B2" t="s"> 
       <v>0</v> 
      </c><c r="C2" t="s"> 
       <v>1</v> 
      </c> 
     </row> 
    </sheetData> 
    <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> 
</worksheet> 

Ví dụ sharedstrings.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="6" uniqueCount="2"> 
    <si> 
     <t>AA</t> 
    </si> 
    <si> 
     <t>BB</t> 
    </si> 
</sst> 

Bạn có thể xem như thế nào tôi đã làm thao tác xml trong bài khác của tôi:

Create Pivot Table Filters With EPPLUS

Rất tiếc, tôi không thể cung cấp cho bạn câu trả lời hay hơn nhưng hy vọng điều đó sẽ hữu ích.

0

@Ernie là chính xác về một số hạn chế của phiên bản EPPlus hiện tại. Họ đã thừa nhận điều đó và đang cố gắng sửa chữa nó. Điều này khiến bạn có một trong hai tùy chọn có thể khiến việc này hoạt động:

1) Chuyển sang EPPlus 4.0 Beta, nơi họ đã khắc phục vấn đề này, cùng với một số thứ khác (mặc dù bạn sẽ sử dụng một phiên bản beta).

2) ExcelPackageExcelWorksheet lớp cả hai thực hiện IDisposable, vì vậy bạn có thể bắt đầu nhận được hiệu suất tốt hơn nếu bạn đã quấn việc bạn sử dụng chúng trong một tuyên bố using().

+2

Bất kỳ documention rằng nó được cố định trong phiên bản beta 4? Nó không có gì khác biệt đối với tôi - đã được cấp này vài tháng trước. Rất thích nó cố định nhưng nó trông giống như nó đòi hỏi một đại tu chính của động cơ cốt lõi. Tôi luôn luôn sử dụng IDisposable (thông qua sử dụng) và nó không có sự khác biệt đối với tôi. Vấn đề là gói/sổ làm việc sẽ vẫn còn trong bộ nhớ cho đến khi đóng hoàn toàn. Tôi thậm chí đã từng cố gắng xuất dữ liệu bằng một loạt mở-lưu-đóng-mở lại-thêm và nó không có sự khác biệt. Đó là một điều tất cả hoặc không có gì - thời điểm bạn mở tập tin nó được tải. Một lần nữa, rất thích được chứng minh là sai. – Ernie

+0

EPPlus 4.1.0 không giải quyết được. Và việc thuyên giảm không giúp ích gì nếu bạn chỉ có 1 trang tính để viết. – Heiner

7

Tôi gặp sự cố này nhưng tôi đã khắc phục sự cố bằng cách chuyển tùy chọn "Platform target", từ x86 thành x64 hoặc "Any CPU". (nhấp chuột phải vào dự án, sau đó chọn "Thuộc tính", sau đó chọn tab "Xây dựng", sau đó chọn "Mục tiêu nền tảng" chọn "x64")

Vấn đề là đối với nền tảng x86 bạn chỉ có thể sử dụng khoảng 1,8 GB RAM. Đối với nền tảng x64, bạn không có giới hạn này.

+1

Điều này cũng phù hợp với tôi. Đã có một bảng tính Excel với 210.000 bản ghi và đã nhận được các ngoại lệ ngoài bộ nhớ. Lúc đầu, tôi nghĩ đó là vì tôi đã làm rất nhiều thứ song song; biên dịch lại trong chế độ x64 giải quyết nó. –

0

Chú ý nếu bạn đang truyền luồng tới ExcelPackage. Trong trường hợp của tôi, tôi đã có một cửa sổ dịch vụ, tải một gói bằng cách sử dụng một bộ nhớ. Bây giờ dịch vụ đã bị lỗi sau một số lần với ngoại lệ OutOfMemory.

Lý do: Việc vứt bỏ ExcelPackage không loại bỏ luồng!

Giải pháp:

using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(excelSheetBase64))) 
using (ExcelPackage excelPackage = new ExcelPackage(ms)) 
{ 
    // Your code 
} 
Các vấn đề liên quan