2011-11-01 22 views
44

Tôi đã cố gắng tải một bảng tính excel ~ 30MB vào R bằng gói XLConnect."Lỗi bộ nhớ ngoài (Java)" khi sử dụng gói R và XLConnect

Đây là những gì tôi đã viết:

wb <- loadWorkbook("largespreadsheet.xlsx") 

Và sau khoảng 15 giây, tôi đã nhận lỗi sau:

Error: OutOfMemoryError (Java): GC overhead limit exceeded.

Đây có phải là một hạn chế của gói XLConnect hoặc là có một cách để tinh chỉnh cài đặt bộ nhớ của tôi để cho phép các tệp lớn hơn?

Tôi đánh giá cao mọi giải pháp/mẹo/lời khuyên.

+1

Bạn đã thử các gói khác chưa? Chuyện gì đã xảy ra với họ? Bởi những người khác, tôi có nghĩa là 'xlsx' và' RExcel'. Hãy xem [họa tiết này] (http://cran.r-project.org/web/packages/xlsx/vignettes/xlsx.pdf) để biết các tài nguyên khác. – Iterator

+1

Riêng biệt, có lẽ bạn có thể xác minh rằng rất có thể sự cố là do bảng tính? Ví dụ: tạo một bảng tính nhỏ và kiểm tra xem nó có hoạt động không. Nếu nó hoạt động, sau đó tôi sẽ tăng hình chữ nhật từ bảng tính, sao chép và dán và xem liệu có thể tìm thấy điểm phá vỡ hay không. Có lẽ có điều gì đó lạ trong bảng tính. – Iterator

+0

Điểm tốt, gói XLConnect dường như hoạt động với các bảng tính nhỏ hơn. Tuy nhiên, tôi muốn tìm giải pháp cho vấn đề này mà không phải thay đổi bảng tính mỗi lần. – AME

Trả lời

28

Thực hiện theo các lời khuyên từ website của họ:

options(java.parameters = "-Xmx1024m") 
library(XLConnect) 
+9

Ngay cả sau khi thiết lập các tùy chọn này, tôi chạy vào lỗi này - Lỗi: OutOfMemoryError (Java): Java Heap Space. – AME

+5

Tôi đã gặp vấn đề về bộ nhớ nhiều lần khi cập nhật Ubuntu Java hoặc gói rJava được cập nhật. Giải pháp options() của bạn đã làm việc cho tôi khi được cấu hình cho nhiều bộ nhớ hơn, vì có lệnh không giới hạn -c không giới hạn trong trình bao. Nhưng Im đã thực hiện theo đuổi vấn đề này. Ive đã chuyển sang openxlsx, điều này làm giảm sự phụ thuộc vào Java và thay vào đó dựa vào C++. Ive không bao giờ nhìn lại. –

+0

@BradHorn Tôi gặp sự cố này và đã thử các giải pháp khác nhau. Tôi đã chắc chắn nó là một vấn đề java bởi vì tập tin của tôi là rất nhỏ, và không ai trong số các gói dựa trên java giải quyết vấn đề, cho đến khi tôi nhìn thấy bình luận của bạn và thử openxlsx. openxlsx là giải pháp dễ nhất để thử xem đó có phải là vấn đề liên quan đến dữ liệu hay vấn đề liên quan đến java hay không. Tôi nghĩ bạn nên đặt bình luận của bạn như một câu trả lời bởi vì mọi người có thể không nhận thấy một bình luận. –

26

Nếu bạn vẫn có vấn đề với nhập khẩu file XLSX bạn có thể sử dụng opiton này. Anwser với "Xmx1024m" không hoạt động và tôi đã thay đổi thành "-Xmx4g".

options(java.parameters = "-Xmx4g") 
library(XLConnect) 

This liên kết hữu ích.

+1

Đây là giải pháp đầu tiên tôi tìm thấy phù hợp với tôi. Rõ ràng nó đòi hỏi phải có ít nhất 4 hợp đồng RAM miễn phí: http://www.bramschoenmakers.nl/en/node/726 – zkurtz

+1

Đã không làm việc ở cuối cho tôi - tôi đã nhận được một lỗi nói rằng Garbage Collector trên không quá lớn. Tôi đã nhận Excel để xuất sang CSV và sau đó sử dụng read.csv gốc với sep = ";" –

+0

Ngay cả sau khi chạy các lệnh này, tôi vẫn có lỗi tương tự. Tôi đang chạy phiên bản 3.1.1 trên x86_64-apple-darwin13.1.0. – kilojoules

12

Sử dụng read.xlsx() trong số openxlsx package. Nó không phụ thuộc vào rJava do đó chỉ có giới hạn bộ nhớ của bản thân R. Tôi chưa khám phá sâu sắc về viết và định dạng XLSX nhưng nó có một số họa tiết tìm kiếm đầy hứa hẹn. Để đọc bảng tính lớn, nó hoạt động tốt.

Mẹo dành cho @ Brad-Horn. Tôi vừa mới đưa ra nhận xét của anh ấy như một câu trả lời bởi vì tôi cũng thấy đây là giải pháp tốt nhất!

+0

Chỉ cần lưu ý: gói này không hoạt động tốt trên Windows. Nó phụ thuộc vào Perl thay vì Java và do đó người ta phải bận tâm với việc cài đặt nó. – Deleet

+0

Thật vậy, gói openxlsx là tốt. Tuy nhiên, nó không hỗ trợ mở sổ làm việc được bảo vệ bằng mật khẩu. – dahved

+0

Có gói nào không? Làm thế nào nó sẽ nhận được mật khẩu? Mật khẩu được lưu trữ trong một kịch bản, biến môi trường? Có lời nhắc cho nó không? – vpipkt

2

Trường hợp này xảy ra, khi bạn tiếp tục sử dụng cùng một phiên R một lần nữa mà không cần khởi động lại R-Studio. Khởi động lại R-Studio có thể giúp phân bổ một bộ nhớ heap mới cho chương trình. Nó làm việc cho tôi ngay lập tức.

3

Trong trường hợp ai đó bắt gặp lỗi này khi đọc không phải là một khổng lồ nhưng nhiều file, tôi quản lý để giải quyết lỗi này bằng cách giải phóng Java bộ nhớ Virtual Machine với xlcFreeMemory(), như sau:

files <- list.files(path, pattern = "*.xlsx") 
for (i in seq_along(files)) { 
    wb <- loadWorkbook(...) 
    ... 
    rm(wb) 
    xlcFreeMemory() # <= free Java Virtual Machine memory ! 
} 
+0

Điều này phù hợp với tôi! Tôi đã thử thiết lập 'java.parameters' nhưng nó không hoạt động. – syd

+0

Tìm thấy tuyệt vời. Vấn đề của tôi là viết và viết lại cùng một tệp. (400K) tệp xlsx khi tất cả đã hoàn tất. – Dan

+0

Ngoài ra, bạn có thể sử dụng tính năng này để xem bộ nhớ khả dụng bằng cách sử dụng: xlcMemoryReport() – aliawadh980

0

Bất cứ khi nào bạn đang sử dụng một thư viện dựa trên rJava (chẳng hạn như RWeka trong trường hợp của tôi), bạn bị ràng buộc để đạt không gian heap mặc định (512 MB) một ngày nào đó. Bây giờ, khi bạn đang sử dụng Java, tất cả chúng ta đều biết đối số JVM để sử dụng (-Xmx2048m nếu bạn muốn 2 gigabyte RAM). Đây chỉ là vấn đề làm thế nào để xác định nó trong môi trường R.

options(java.parameters = "-Xmx2048m") 
    library(rJava) 
Các vấn đề liên quan