Tôi đã gặp một số vấn đề với việc phân tích cú pháp các tệp .xlsx
với Apache POI - Tôi đang nhận được java.lang.OutOfMemoryError: Java heap space
trong ứng dụng được triển khai của mình. Tôi chỉ xử lý các tệp dưới 5MB và khoảng 70.000 hàng nên tôi nghi ngờ đọc số câu hỏi khác là có điều gì đó không ổn.Apache POI nhanh hơn nhiều khi sử dụng HSSF so với XSSF - tiếp theo là gì?
Như được đề xuất trong this comment Tôi đã quyết định chạy SSPerformanceTest.java
với các biến được đề xuất để xem có điều gì sai với mã hoặc thiết lập của tôi hay không. Kết quả cho thấy một sự khác biệt đáng kể giữa HSSF (.xls
) và XSSF (.xlsx
):
1) HSSF 50000 50 1: đã qua 1 giây
2) SXSSF 50000 50 1: đã qua 5 giây
3) XSSF 50000 50 1: đã qua 15 giây
Các FAQ đặc biệt nói:
If you can't run that with 50,000 rows and 50 columns in all of HSSF, XSSF and SXSSF in under 3 seconds (ideally a lot less!), the problem is with your environment.
Tiếp theo, nó nói để chạy XLS2CSV.java
mà tôi đã làm. Cho ăn trong tập tin XSSF được tạo ra ở trên (với 50000 hàng và 50 cột) mất khoảng 15 giây - cùng một số tiền cần để ghi tệp.
Có vấn đề gì với môi trường của tôi và nếu có thì làm cách nào để điều tra thêm?
Số liệu thống kê từ VisualVM hiển thị vùng heap được sử dụng quay lên tới 1,2Gb trong khi xử lý. Chắc chắn đây là cách quá cao xem xét đó là một buổi biểu diễn thêm trên đầu trang của đống so với trước khi chế biến bắt đầu?
Lưu ý: Các không gian đống ngoại lệ nêu trên chỉ xảy ra trong sản xuất (trên Google App Engine) và chỉ dành cho .xlsx
file, tuy nhiên các cuộc thử nghiệm đề cập trong câu hỏi này đều được chạy trên máy phát triển của tôi với -Xmx2g
. Tôi hy vọng rằng nếu tôi có thể khắc phục vấn đề về thiết lập phát triển của mình, nó sẽ sử dụng ít bộ nhớ hơn khi triển khai.
Stack trace từ động cơ ứng dụng:
Caused by: java.lang.OutOfMemoryError: Java heap space at org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:260) at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2997) at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3211) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportStartTag(Piccolo.java:1082) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1802) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521)
Bạn không đơn độc: http://stackoverflow.com/questions/34246083/apache-poi-performance – raggi
Chết tiệt, tôi đã đọc rất nhiều câu hỏi ở đây nhưng không tìm thấy câu hỏi đó! Cảm ơn rất nhiều. Dường như nó là một vấn đề với thư viện sau đó, nếu sự im lặng từ danh sách gửi thư là bất cứ điều gì để đi theo. Có thể bắt đầu làm việc trên một workaround. – slugmandrew