2013-04-19 26 views
6

Tôi có một số lượng lớn các khung dữ liệu trong R mà tôi dự định lưu trữ bằng cách sử dụng redis. Tôi hoàn toàn mới với redis nhưng đã được đọc về nó ngày hôm nay và đã được sử dụng gói R rredis.Lưu trữ các khung dữ liệu lớn màu đỏ thông qua R

Tôi đã phát xung quanh với dữ liệu nhỏ và đã lưu và truy xuất các khung dữ liệu nhỏ sử dụng các chức năng redisSet()redisGet(). Tuy nhiên khi nói đến tiết kiệm dataframes lớn của tôi (lớn nhất trong số đó là 4,3 triệu hàng và 365MB khi lưu lại dưới dạng tập tin .RData) sử dụng mã redisSet('bigDF', bigDF) tôi nhận được thông báo lỗi sau:

Error in doTryCatch(return(expr), name, parentenv, handler) : 
    ERR Protocol error: invalid bulk length 
In addition: Warning messages: 
1: In writeBin(v, con) : problem writing to connection 
2: In writeBin(.raw("\r\n"), con) : problem writing to connection 

Có lẽ vì dataframe quá lớn để tiết kiệm. Tôi biết rằng redisSet viết dataframe như một chuỗi, có lẽ không phải là cách tốt nhất để làm điều đó với các khung dữ liệu lớn. Có ai biết cách tốt nhất để làm điều này?

EDIT: Tôi đã tái tạo các lỗi khi tạo của tôi một dataframe giả rất lớn:

bigDF <- data.frame(
'lots' = rep('lots',40000000), 
'of' = rep('of',40000000), 
'data' = rep('data',40000000), 
'here'=rep('here',40000000) 
) 

Chạy redisSet('bigDF',bigDF) mang lại cho tôi những lỗi:

Error in .redisError("Invalid agrument") : Invalid agrument 

lần đầu tiên, sau đó chạy nó một lần nữa ngay sau đó Tôi gặp lỗi

Error in doTryCatch(return(expr), name, parentenv, handler) : 
    ERR Protocol error: invalid bulk length 
In addition: Warning messages: 
1: In writeBin(v, con) : problem writing to connection 
2: In writeBin(.raw("\r\n"), con) : problem writing to connection 

Cảm ơn

+0

Chia sẻ mã thực tế bạn đang sử dụng trong khối mã được định dạng. Điều này sẽ giúp người nào đó có kinh nghiệm chẩn đoán và đề xuất điều chỉnh dễ dàng hơn nhiều. –

Trả lời

7

Tóm tắt: bạn không thể. Redis can store a maximum of 512 Mb of data in a String value và khung dữ liệu demo serialized của bạn lớn hơn rằng:

> length(serialize(bigDF, connection = NULL))/1024/1024 
[1] 610.352 

nền kỹ thuật:

serialize được gọi trong .cerealize chức năng của gói qua redisSetrredis:::.redisCmd:

> rredis:::.cerealize 
function (value) 
{ 
    if (!is.raw(value)) 
     serialize(value, ascii = FALSE, connection = NULL) 
    else value 
} 
<environment: namespace:rredis> 

Offtopic: tại sao bạn lưu trữ một tập dữ liệu lớn như vậy trong redis? Redis dành cho các cặp khóa-giá trị nhỏ. Mặt khác, tôi đã có một số thành công lưu trữ bộ dữ liệu R lớn trong CouchDBMongoDB (với GridFS) bằng cách thêm nén RData ở đó dưới dạng phần đính kèm.

+0

Cảm ơn daroczig, vì vậy chỉ để làm rõ bạn đang truy vấn chiều dài (serialize (... cho kích thước của chuỗi giá trị trong Mb? Tôi giả sử tôi có thể chia dataframe trong 2 và lưu nó một cách riêng biệt nhưng đưa ra bình luận cuối cùng của bạn tôi giả sử bạn Đối với câu hỏi của bạn, tôi chỉ mới bắt đầu sử dụng redis vì vậy không nhận thức được những hạn chế của nó trong việc lưu trữ các tập dữ liệu lớn, tôi đã nghe nó là một cách tốt để lưu trữ và truy xuất dữ liệu một cách nhanh chóng. Nhìn vào nó, tôi sẽ xem xét CouchDB và MongoDB – user1165199

+1

Bộ nhớ tối ưu cho bộ dữ liệu R của bạn thực sự phụ thuộc vào nhu cầu của bạn. càng nhiều dữ liệu phù hợp với bộ nhớ vật lý của bạn.Mặt khác, nếu bạn chỉ truy cập dữ liệu đó trên localhost, thì không cần một DB backend: tạo một đĩa RAM và ghi 'RData' ở đó một cách nhanh chóng và tải lại bất cứ lúc nào. Bạn cũng nên tìm ra phương pháp và tỷ lệ nén tối ưu (CPU vs IO). Nếu bạn sử dụng nhiều máy tính, sau đó chọn DB của bạn theo nhu cầu của bạn như sao chép, sharding vv – daroczig

+1

@daroczig, bài viết trên của bạn bỏ qua các nhu cầu khác tại sao người ta muốn lưu trữ các mục lớn hơn trong Redis, từ khóa: trao đổi dữ liệu. Người ta có thể tạo ra các mục dữ liệu lớn hơn trong C# và lưu trữ trong Redis để dễ dàng truy cập vào R hoặc theo cách khác. Chắc chắn, nếu một người chỉ muốn lưu trữ trong R tạo ra dữ liệu và tái truy cập sau này trong R sau đó lưu trữ vào đĩa là giải pháp tốt nhất, có thể kết hợp với bộ nhớ ánh xạ tập tin. Nhưng việc sử dụng Redis tạo ra rất nhiều ý nghĩa để trao đổi dữ liệu khi các vị trí giữa nguồn và đích của dữ liệu không được chia sẻ và Redis là điểm trao đổi duy nhất. –

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