2014-04-22 18 views
11

Tôi đang cố gắng chạy một số mã R và nó bị lỗi do bộ nhớ. Các lỗi mà tôi nhận được là:vectơ dài không được hỗ trợ chưa được

Error in sendMaster(try(lapply(X = S, FUN = FUN, ...), silent = TRUE)) : 
    long vectors not supported yet: memory.c:3100 

Chức năng tạo ra những rắc rối như sau:

StationUserX <- function(userNDX){ 
    lat1 = deg2rad(geolocation$latitude[userNDX]) 
    long1 = deg2rad(geolocation$longitude[userNDX]) 
    session_user_id = as.character(geolocation$session_user_id[userNDX]) 
    #Find closest station 
    Distance2Stations <- unlist(lapply(stationNDXs, Distance2StationX, lat1, long1)) 
    # Return index for closest station and distance to closest station 
    stations_userX = data.frame(session_user_id = session_user_id, 
           station = ghcndstations$ID[stationNDXs], 
           Distance2Station = Distance2Stations)  
    stations_userX = stations_userX[with(stations_userX, order(Distance2Station)), ] 
    stations_userX = stations_userX[1:100,] #only the 100 closest stations... 
    row.names(stations_userX)<-NULL 
    return(stations_userX) 
} 

tôi chạy chức năng này sử dụng mclapply 50k lần. StationUserX đang gọi Distance2StationX 90k lần.

Có cách nào rõ ràng để tối ưu hóa chức năng StationUserX không?

+0

bạn có truy xuất 'Vectorize' hoặc' cmpfun' (trong gói 'trình biên dịch') để xem liệu nó có cung cấp mọi tốc độ dễ dàng không? –

+0

cũng suy nghĩ về 'foreach' cho song song đó là tầm thường để thực hiện –

Trả lời

13

mclapply đang gặp sự cố khi gửi lại tất cả dữ liệu từ chuỗi công việc vào chuỗi chính. Đó là do việc lên kế hoạch, nơi mà nó chạy số lần lặp lớn cho mỗi luồng, và sau đó đồng bộ tất cả dữ liệu trở lại. Đó là tốt đẹp và nhanh chóng, nhưng kết quả trong> 2GB dữ liệu được gửi trở lại, mà nó không thể làm.

Chạy mclapply với mc.preschedule=F để tắt tính năng lập lịch trước. Bây giờ, mỗi lần lặp sẽ sinh ra luồng riêng của nó và sẽ trả về dữ liệu riêng của nó. Nó sẽ không diễn ra nhanh như vậy, nhưng nó xoay quanh vấn đề.

-1

Hãy thử sử dụng nextElem() từ gói iterators. Nó hoạt động như một "generator" in Python, vì vậy bạn không phải tải toàn bộ danh sách vào bộ nhớ.

+0

Tôi đang tìm trang người đàn ông cho nextElem nhưng tôi không thực sự có được làm thế nào tôi nên sửa đổi chức năng của tôi để sử dụng nó. Bạn có thể cho tôi xem? Cảm ơn! – Ignacio

+0

Bạn có thể cho biết đối tượng nào là "vectơ dài" đang gây ra sự cố không? Ý tưởng là bạn sẽ sử dụng '' 'nextElem()' '' để truyền các phần tử của vectơ một, thay vì truyền toàn bộ vectơ trong một lần. – rsoren

+0

Thông báo lỗi không thực sự nói. Tôi đang gọi StationUserX với Mappapply và đi qua StationUserX. StationUserX Là một vector của 50k quan sát. Đối tượng mà hàm tạo ra, stations_userX là một đối tượng thực sự lớn. Tôi có 100 trạm thời gian 50 nghìn người dùng. Vì vậy, đầu ra sẽ có 5 hàng Millon và 3 cột. – Ignacio

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