2013-07-11 22 views
11

Tôi muốn biết liệu có giới hạn về số hàng có thể đọc được bằng hàm fread data.table hay không. Tôi đang làm việc với một bảng với 4 tỷ hàng, 4 cột, khoảng 40 GB. Có vẻ như fread sẽ chỉ đọc ~ 840 triệu hàng đầu tiên. Nó không đưa ra bất kỳ lỗi nào nhưng trả về dấu nhắc R như thể nó đã đọc tất cả dữ liệu!Giới hạn hàng cho dữ liệu.trong R bằng cách sử dụng fread

Tôi hiểu rằng fread không dành cho "prod use" vào lúc này và muốn tìm hiểu xem có bất kỳ khung thời gian nào để triển khai bản phát hành sản phẩm hay không.

Lý do tôi đang sử dụng data.table là, cho các tập tin có kích thước như vậy, nó là vô cùng hiệu quả trong việc xử lý dữ liệu so với tải các tập tin trong một data.frame vv

Tại thời điểm này, tôi đang cố gắng 2 lựa chọn thay thế khác -

1) Sử dụng quét và truyền lại cho một data.table

data.table(matrix(scan("file.csv",what="integer",sep=","),ncol=4)) 

Resulted in -- 
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
    too many items 

2) Breaking file ra thành nhiều phân đoạn riêng lẻ với một giới hạn khoảng. 500 triệu hàng bằng cách sử dụng Unix tách và đọc chúng tuần tự ... sau đó lặp lại các tập tin tuần tự vào fread - một chút rườm rà, nhưng dường như là giải pháp khả thi duy nhất.

Tôi nghĩ rằng có thể có một cách Rcpp để làm điều này thậm chí nhanh hơn, nhưng tôi không chắc chắn cách nó thường được thực hiện.

Xin cảm ơn trước.

+1

Hãy chắc chắn rằng không có gì bất thường trong tập tin của bạn trong dòng cuối cùng đã được đọc hoặc dòng sau đó là gì và sau đó [nộp] (https: // r-rèn. r-project.org/tracker/?group_id=240) báo cáo lỗi hoặc liên hệ với mantainer gói. – Roland

+0

Bạn có chắc là bạn có đủ RAM không? Và bạn đang làm việc với 64bit R? – eddi

+0

Không, không nhất thiết phải là cách nhanh hơn với Rcpp vì Matt đã sử dụng mmap. Kiểm tra tài liệu hệ điều hành của bạn để biết giới hạn về cuộc gọi mmap. Hàng tỷ có thể đang đẩy nó ... –

Trả lời

8

Tôi có thể thực hiện việc này bằng phản hồi từ một bài đăng khác trên Stackoverflow. Quá trình này rất nhanh và 40 GB dữ liệu đã được đọc trong khoảng 10 phút bằng cách sử dụng fread lặp đi lặp lại. Foreach-dopar không hoạt động khi chạy tự nó để đọc các tập tin vào data.tables mới tuần tự do một số hạn chế mà cũng được đề cập trên trang dưới đây.

Lưu ý: Danh sách tập tin (file_map) đã được chuẩn bị bằng cách đơn giản chạy -

file_map <- list.files(pattern="test.$") # Replace pattern to suit your requirement 

mclapply with big objects - "serialization is too large to store in a raw vector"

Trích dẫn -

collector = vector("list", length(file_map)) # more complex than normal for speed 

for(index in 1:length(file_map)) { 
reduced_set <- mclapply(file_map[[index]], function(x) { 
    on.exit(message(sprintf("Completed: %s", x))) 
    message(sprintf("Started: '%s'", x)) 
    fread(x)    # <----- CHANGED THIS LINE to fread 
}, mc.cores=10) 
collector[[index]]= reduced_set 

} 

# Additional line (in place of rbind as in the URL above) 

for (i in 1:length(collector)) { rbindlist(list(finalList,yourFunction(collector[[i]][[1]]))) } 
# Replace yourFunction as needed, in my case it was an operation I performed on each segment and joined them with rbindlist at the end. 

chức năng của tôi bao gồm một vòng lặp sử dụng Foreach dopar rằng thực hiện trên nhiều lõi cho mỗi tệp như được chỉ định trong tệp_map. Điều này cho phép tôi sử dụng dopar mà không gặp phải lỗi "serialization quá lớn" khi chạy trên tệp kết hợp.

Một bài hữu ích là tại - loading files in parallel not working with foreach + data.table

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