2015-06-26 13 views
5

Tôi đang sử dụng Grails 2.4.4 và cố gắng tải lên tệp .xlsx bằng plugin 'apache poi' nhưng tôi nhận được ngoại lệ kích thước JAVA Heap khi kích thước tệp là xung quanh 8 MB.OutOfMemoryError: Vùng heap Java để tải lên tệp kích thước 8 MB

My điều khiển có các phương pháp hành động và sau: -

def uploadForm() {  
     String fileName = "D:\\File.xlsx" 
     Map excelSheetMap = process(fileName) 
} 

Map process(String fileName) { 
    ExcelBuilder excelBuilder = new ExcelBuilder(fileName) 
    //Getting JAVA Heap Size exception here when I am trying to create an object 
    //of ExcelBuilder with the file  
} 

ExcelBuilder.groovy tập tin lớp trông giống như sau

class ExcelBuilder { 
    Workbook workbook 
    ExcelBuilder(String fileName) {  
     new File(fileName).withInputStream { is -> 
     workbook = new XSSFWorkbook(is) 
     } 
    } 
} 

Tôi đã cố gắng sử dụng các plugin grails-excel-nhập khẩu cũng nhưng tôi nhận được cùng một ngoại lệ.

Ai đó có thể đề xuất cách nhập các tệp excel có kích thước lớn trong grails. Cảm ơn trước.

+1

Bạn đã cố gắng để tăng bộ nhớ ứng dụng? Ví dụ. 'run: [maxMemory: 1280, minMemory: 128, debug: false, maxPerm: 256, forkReserve: true, jvmArgs: jvmArgs]' trong BuildConfig của bạn? – defectus

+0

có, tôi đã thử điều này nhưng nhận được như vậy. –

+1

Và nếu bạn tạo một dự án nhỏ (grails-less), kịch bản có khả năng hấp dẫn, để kiểm tra chỉ là tải tệp od, nó có hoạt động không? – defectus

Trả lời

0

Poi không có dung lượng bộ nhớ cao. Vui lòng xem: http://poi.apache.org/spreadsheet/index.html

Bạn có thể thử SXSSF. SXSSF là một phần mở rộng tương thích trực tuyến API của XSSF được sử dụng khi các bảng tính rất lớn phải được tạo ra và không gian heap bị giới hạn.

0

Vấn đề với 'XSSF API' này là khi tôi đã tạo đối tượng gốc (sổ làm việc) cho bảng excel, không gian heap đầy trong khi tạo đối tượng và thiếu không gian heap để xây dựng đối tượng sổ làm việc. Vì vậy, nó là ít có thể xử lý các tấm sau khi tăng kích thước heap bởi vì excel tờ có thể lớn hơn nhiều.

new File(fileName).withInputStream { is -> 
     workbook = new XSSFWorkbook(is) 
     //Getting JAVA Heap Size exception here when I am trying to create an object 
     } 

Vì vậy, sau một số R & D Tôi đã tìm thấy thêm một API để xử lý lớn vượt trội tấm tức là "XSSF và SAX (Event API)". Nhưng đối với điều này, bạn có thể lấy dữ liệu XML cơ bản và tự xử lý nó.

Bạn có thể tìm thấy những tài liệu đầy đủ ở đây, https://poi.apache.org/spreadsheet/how-to.html

Cảm ơn

+0

Tại sao bạn sử dụng 'InputStream' khi bạn có' File'? Các tài liệu [khá rõ ràng về việc cần nhiều bộ nhớ hơn] (http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream)! – Gagravarr

Các vấn đề liên quan