2013-08-26 40 views
7

Tôi đang sử dụng fread trong data.table (1.8.8, R 3.0.1) trong một nỗ lực để đọc các tệp rất lớn.Lỗi tràn ngăn xếp bảo vệ fread

Tệp trong câu hỏi có 313 hàng và ~ 6.6 triệu cols hàng dữ liệu số và tệp có kích thước khoảng 12gb. Đây là một Centos 6.4 với RAM 512GB.

Khi tôi cố gắng để đọc trong file:

g=fread('final.results',header=T,sep=' ') 
'header' changed by user from 'auto' to TRUE 
Error: protect(): protection stack overflow 

tôi đã cố gắng bắt đầu R với max-ppsize 500000, đó là tối đa, nhưng lỗi tương tự.

Tôi cũng đã cố gắng thiết lập kích thước ngăn xếp để không giới hạn thông qua

ulimit -s unlimited 

bộ nhớ ảo đã được thiết lập để không giới hạn.

Tôi không thực tế với tệp có kích thước này? Tôi đã bỏ lỡ một cái gì đó khá rõ ràng?

+0

Vui lòng thử v1.8.9 trên R-Forge (liên kết trên trang chủ data.table). Có 10 bản sửa lỗi cho 'fread' ở đó, xem TIN TỨC. Hỗ trợ tệp lớn là một trong số chúng, nhưng trên Windows như đã được chấp nhận trên Linux. 6,6 triệu cột (!) Là mới và cũng có thể là một lỗi mới. Vui lòng xác nhận với v1.8.9 và chúng tôi sẽ đi từ đó ... –

+0

@MatthewDowle Có Tôi không hài lòng với 6 triệu hàng. Cài đặt 1.8.9, lỗi tương tự. Tôi đã tạo một tệp nhỏ hơn nhiều, 10 hàng x 50K cols, cùng một lỗi. 10 hàng x 49.999 cols nó hoạt động. – mpmorley

+1

Ý của bạn là các cột trong nhận xét đó (bạn đã viết 6 triệu hàng)? Rất thú vị và kỳ lạ nó không thành công tại 50.000 cột chính xác. Thực hiện tốt để mài giũa trong đó một cách nhanh chóng. Tôi không nhớ bất kỳ giới hạn cột nào như thế. Sẽ có một cái nhìn. –

Trả lời

6

Bây giờ đã được sửa trong v1.8.9 trên R-Forge.

  • Một giới hạn 50.000 cột ngoài ý muốn đã được gỡ bỏ trong fread. Nhờ mpmorley để báo cáo. Đã thêm kiểm tra.

Lý do là tôi đã phần này sai trong fread.c nguồn:

// ********************************************************************* 
// Allocate columns for known nrow 
// ********************************************************************* 
ans=PROTECT(allocVector(VECSXP,ncol)); 
protecti++; 
setAttrib(ans,R_NamesSymbol,names); 
for (i=0; i<ncol; i++) { 
    thistype = TypeSxp[ type[i] ]; 
    thiscol = PROTECT(allocVector(thistype,nrow)); // ** HERE ** 
    protecti++; 
    if (type[i]==SXP_INT64) 
     setAttrib(thiscol, R_ClassSymbol, ScalarString(mkChar("integer64"))); 
    SET_TRUELENGTH(thiscol, nrow); 
    SET_VECTOR_ELT(ans,i,thiscol); 
} 

Theo R-exts section 5.9.1, bảo vệ bên trong vòng lặp không cần thiết:

Trong một số các trường hợp cần phải theo dõi tốt hơn về việc liệu sự bảo vệ có thực sự cần thiết hay không. Hãy đặc biệt nhận thức được các tình huống mà một số lượng lớn các đối tượng được tạo ra. Con trỏ ngăn xếp bảo vệ có kích thước cố định (mặc định là 10.000) và có thể đầy. Nó không phải là một ý tưởng tốt sau đó để chỉ bảo vệ tất cả mọi thứ trong tầm nhìn và UNPROTECT vài nghìn đối tượng ở cuối. Nó sẽ gần như luôn luôn có thể hoặc là chỉ định các đối tượng như là một phần của đối tượng khác (mà tự động bảo vệ chúng) hoặc không bảo vệ chúng ngay lập tức sau khi sử dụng.

Vì vậy, PROTECT đó hiện đã bị xóa và tất cả đều tốt. (Dường như giới hạn ngăn xếp con trỏ bảo vệ đã bị giảm xuống còn 50.000 vì văn bản đó được viết; Defn.h chứa #define R_PPSSIZE 50000L.) Tôi đã kiểm tra tất cả các PROTECT khác trong dữ liệu. Có thể nguồn C cho bất kỳ thứ gì tương tự và được tìm thấy và cố định trong gán .c quá (khi thêm hơn 50.000 cột theo tham chiếu), không có người khác.

Cảm ơn bạn đã báo cáo!

+0

Thử nghiệm với một tệp 313 hàng và 6536299 cols. 'system.time (geno <-fread ('final.results', sep = '', header = TRUE))' 'hệ thống người dùng đã trôi qua ' ' 881.321 16.594 923.957' – mpmorley

+0

@mpmorley Tuyệt vời, cảm ơn bạn đã thử nghiệm. 15 phút để đọc một tệp 12 GB có vẻ ổn, có thể, vì nó quá rộng. Nó có ổn không? Có bất cứ điều gì khác đọc nó nhanh hơn? Sẽ được quan tâm để xem bảng phân tích thời gian được báo cáo bởi 'verbose = TRUE'. Ví dụ, nếu nó được sử dụng chủ yếu là mmap'ing, có thể có thêm các tùy chọn để điều chỉnh. –

+0

Đối với tôi điều đó có thể chấp nhận được, tôi không tập trung vào việc làm điều gì đó hữu ích với tất cả dữ liệu này, có thể thấy một bài đăng mới. Tuy nhiên tôi rất vui khi chạy và đăng nếu bạn và những người khác quan tâm. – mpmorley

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