静的で大規模 (>100M) で複雑なメモリ内データ構造にアクセスし、クエリを受け入れ、そのデータの小さなスライスを HTTP 経由でクライアントに提供する Node アプリがあります。
ほとんどのクエリは、10 分の 1 秒で回答できます。ノード万歳!
ただし、特定のクエリでは、このデータ構造の検索に数秒かかります。他の誰もが待たなければならないので、これは最悪です。
より多くのクライアントに効率的にサービスを提供するために、ある種の並列処理を使用したいと考えています。
しかし、このデータ構造は非常に大きいため、数百メガバイトを消費しないように、ワーカー間またはスレッド間で共有したいと考えています。データ構造が書き込まれないため、これは完全に安全です。他の言語の典型的な「fork()」でそれができます。
ただし、私が知る限り、Node.js で並列処理を行う標準的な方法はすべて、これを明示的に不可能にします。安全のために、彼らはあなたが何かを共有することを望んでいません.
しかし、方法はありますか?
バックグラウンド:
このデータ構造をデータベースに配置したり、memcached を使用したりすることは現実的ではありません。
WebWorker API ライブラリなどでは、シリアル化された短いメッセージのみをワーカーに出し入れできます。
ノードのクラスターは「fork」という名前の呼び出しを使用しますが、実際には既存のプロセスのフォークではなく、新しいプロセスを生成しています。繰り返しになりますが、共有メモリはありません。
おそらく本当に正しい答えは、共有メモリへのファイルシステムのようなアクセス、別名 tmpfs、または mmap を使用することでしょう。これとまったく同じように mount() と mmap() を利用できるノード ライブラリがいくつかあります。残念ながら、同期シークと読み取りの上に複雑なデータ構造アクセスを実装する必要があります。私のアプリケーションでは、辞書の配列の配列などを使用しています。それをすべて再実装する必要がないのはいいことです。