6

Rには、redisを使用して保存する予定の大きなデータフレームが多数あります。私は redis にまったく慣れていませんが、今日それについて読んでいて、R パッケージを使用していますrredis

redisSet()私は小さなデータをいじり、関数と関数を使用して小さなデータフレームを保存および取得しましたredisGet()。ただし、コードを使用してより大きなデータフレーム (.RData ファイルとして保存した場合、最大のものは 430 万行で 365MB) を保存するとredisSet('bigDF', bigDF)、次のエラー メッセージが表示されます。

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

おそらく、データフレームが大きすぎて保存できないためです。redisSet がデータフレームを文字列として書き込むことは知っていますが、これはおそらく大きなデータフレームで行う最善の方法ではありません。これを行う最良の方法を知っている人はいますか?

編集:非常に大きなダミーデータフレームを作成する際にエラーを再現しました:

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

実行redisSet('bigDF',bigDF)するとエラーが発生します:

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

初めて、その後すぐにもう一度実行すると、エラーが発生します

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

ありがとう

4

1 に答える 1

7

要するに、できません。Redis は最大 512 Mb のデータを String 値に格納でき、シリアル化されたデモ データ フレームはそれよりも大きくなります。

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

技術的背景:

serialize.cerealizeパッケージの関数でredisSetandを介して呼び出されますrredis:::.redisCmd:

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

オフトピック:なぜそんなに大きなデータセットを redis に保存するのですか? Redis は小さなキーと値のペア用です。一方で、大きな R データセットをCouchDBMongoDB (GridFS を使用)に格納することに成功しRDataました。

于 2013-04-25T19:57:45.257 に答える