2016-11-24 3 views
0

私はアルゴリズムのために非常に頻繁に照会する必要がある〜200GBの非常に大きな辞書を持っています。速い結果を得るために、私はそれを可能な限りメモリに入れたいと思います。幸いにも私は500GBのRAMを持っているからです。非常に大きな辞書をPythonでメモリにロードしたままにするには?

しかし私の主な問題は、新しいプロセスを作成するたびにコードを繰り返し実行するのではなく、メモリ内に一度だけロードしてから別のプロセスに同じ辞書を照会させたいということです。

スクリプト1:

# Load dictionary in memory 
def load(data_dir): 
    dictionary = load_from_dir(data_dir) ... 

スクリプト2:

# Connect to loaded dictionary (already put in memory by script 1) 
def use_dictionary(my_query): 
    query_loaded_dictionary(my_query) 

これを達成するための最良の方法は何ですか

だから、私はこのような何かをしたいと思いますか?私は残りのAPIを考慮しましたが、RESTリクエストを超えると、最初にメモリに辞書を置くことによって得られるすべての速度が低下するかどうか疑問に思います。

提案がありますか?

+0

多分redisが助けになるようなものを使用してください。 –

+0

はい、赤字も良い考えです。私はPythonでこれを行う方法があるのだろうかと思っていた。以前はmongodbを試しましたが、最新のwiredtigerバージョンのmongodbには、メモリ内のすべてのデータをプリロードするオプションがありません。問題は私がrootのパスワードを持っていないことです、私はあまりにも多くのソフトウェアをインストールしたくありませんでした。しかし、私にレディスしよう。 –

+0

NOSQLデータベースを再作成しようとしていますか?既存のものに頼らないのはなぜですか? –

答えて

1

前述のようにREST APIを使用してアクセスする別個のサービスを実行するか、インメモリデータベースを使用してください。

私はRedisで非常に良い経験をしていますが、他にも多くのものがあります(Memcachedも人気です)。 RedisはPythonとDjangoで使いやすいものでした。

どちらのソリューションでもデータのシリアライズが可能なため、パフォーマンスが低下します。レディスにはリストなどの単純な構造を記入する方法がありますが、私は試していません。私は数値配列をパックし、それらを(numpyで)直列化しました。とにかく単純な文字列のキーと値のペアを使用すると、パフォーマンスが最適になり、おそらくmemcachedでうまくいくでしょう。

関連する問題