私は静的で大きな(> 100M)、複雑なメモリ内のデータ構造にアクセスし、クエリを受け取り、そのデータの小さなスライスをHTTP経由でクライアントに提供するNodeアプリケーションを持っています。Node.JSのワーカー/スレッド/何かの間でメモリを共有する方法はありますか?
ほとんどのクエリは、10分の1秒で答えることができます。ノードのためのHurray!
しかし、特定のクエリでは、このデータ構造を検索するのに数秒かかります。他の誰もが待たなければならないので、これは吸う。
より多くのクライアントに効率的にサービスを提供するために、何らかの並列処理を使用したいと思います。
しかし、このデータ構造は非常に大きいので、私はそれをワーカーやスレッド間で共有したいのですが、何百メガバイトも焼き付けません。データ構造が書き込まれないため、これは完全に安全です。他の言語の典型的な 'fork()'がそれを行います。
しかし、私が知る限り、Nodeで並列処理を行うすべての標準的な方法は、これを明示的に不可能にしています。安全のために、あなたは何かを共有することを望んでいません。
しかし、方法はありますか?
背景:
データベースにこのデータ構造を置くことは現実的ではない、またはmemcachedの、またはそのようなものを使用します。
WebWorker APIライブラリなどでは、短いシリアライズされたメッセージだけがワーカーに出入りすることができます。
ノードのクラスタは 'fork'という名前のコールを使用しますが、実際には既存のプロセスのフォークではなく、新しいものを生成します。だからもう一度、共有メモリはありません。
本当に正しい答えは、共有メモリ、別名tmpfs、またはmmapへのファイルシステムのようなアクセスを使用することでしょう。このようなもののためにmount()とmmap()を利用できるいくつかのノードライブラリがあります。残念ながら、同期シークとリードの上に複雑なデータ構造のアクセスを実装する必要があります。私のアプリケーションでは、dictsなどの配列の配列を使用しています。すべてを再実装する必要がないのはいいことです。
残りの部分をブロックしないように、(process.nextTickを使用して)検索を先取りできませんか? – robertklep
'このデータ構造をデータベースに入れたり、memcachedなどを使うのは実用的ではありません。いつから? – freakish
freakish:各アイテムがクエリのサブセットであるかどうかを確認しています。私たちが文字列 "fooquux"を持っているとしたら、その文字列に "ox"が含まれているかどうかチェックしたいとします。通常のデータベース操作で効率的に処理する方法はわかりません。しかし、通常のデータ構造としてアクセスできるのは簡単です。これらの多数のデータがソートされ、ランク付けされ、これらはデータの「ポインタ」であり、データ構造内にデータを持たない限り、実際的ではありません。 – NeilK