2016-03-24 8 views
0

大(numpy)配列を構築する必要がある(Django)Webアプリケーションがあります。これはいくつかのプロセス(Apache/mod_wsgiで生成)で動作します。シリアライズされていないデータの共有メモリキャッシュ

現時点で私はインメモリキャッシュを使用していますが、最も単純なバージョンはグローバル変数です。キャッシュからデータを取得することは瞬時に実行できます。しかし、各プロセスはそれぞれのメモリ内のキャッシュを複製する必要があります。データはロードされていません(スタートアップ時に一度だけロードする必要があります)。unpredictableです。

私はMemcachedRedisにプロセス間で共有キャッシュを試そうとしました。どちらの場合も、最初に直列化されるデータ(文字列とintのみ)が必要です。今、ベクトルを読みたいときにデシリアライズするのに約10秒かかります。ボタンをクリックして待っているユーザーにとっては少し時間がかかります。

同時に文字列にシリアル化せずにRAMにいくつかの任意のデータを格納し、それを異なるプロセス間で共有できるソリューションはありませんか? (私は再起動後の永続性には関心がありません)。

答えて

2

Redisのは

文字列はRedisの値の最も基本的な一種である生のバイトを含め、多くのdata typesをサポートしています。 Redis Stringsは バイナリセーフです。つまり、Redis文字列には データの任意の種類、たとえばJPEG画像またはシリアル化されたRubyオブジェクトを含めることができます。

Redisは高速であることが証明されています。したがって、おそらく、デシリアライズを効率的に行うシリアル化フォーマットに焦点を当てるべきです。

+1

あなたは、このような部分文字列を取得するために、文字列値とGETRANGEでバイトの任意の範囲を変更するためのRedisのSETRANGEコマンドを使用することができますに注意してください。 Pythonの文字列(2.x)やバイト文字(3.x)と同様、バイナリセーフです。したがって、@ simpsojoがここで述べたように、これらのコマンドをさまざまなバルク直列化/逆シリアル化オプションとともに使用できます。概念的には、これはある種のキーに格納されている値を一種のmmap()領域(大きな共有のバイト配列)として扱うのと同じです。ただし、Redisは調整を処理します(ロックの問題はありません)。 –

+0

あなたが同意するなら、答えを受け入れることはできますか?ありがとう –

関連する問題