ドキュメント内に大きなバイナリ配列を格納しています。この配列に継続的にバイトを追加し、時には既存のバイトの値を変更したいと考えています。
$append_bytes および $replace_bytes タイプの修飾子を探していましたが、配列に対して $push を実行するのが最善のようです。ディスク上の基礎となるbsonに何らかの形でアクセスできれば、シークライトタイプの操作を実行することでこれが実行できるように思えますが、mongodbでこれを行う方法があるとは思えません(おそらく正当な理由があります)。
代わりに、このバイナリ配列をクエリし、編集または追加し、フィールド全体を書き換えてドキュメントを更新するとしたら、コストはどれくらいかかりますか? 各バイナリ配列は 1 ~ 2 MB 程度で、更新は 5 分ごとに 1 回、数千のドキュメントにわたって行われます。さらに悪いことに、これらを (時間内に) 分散させる簡単な方法はなく、通常は 5 分間隔で互いに近接して発生します。これがどれほど悲惨なことになるかについて、良い感触を持っている人はいますか?問題になりそうです。
別の方法として、このバイナリ データを個別のファイルとしてディスクに保存し、スレッド プールを実装してディスク上のファイルを効率的に操作し、mongodb ドキュメントからファイル名を参照することもできます。(私はpythonとpymongoを使用しているので、pytablesを見ていました)。可能であれば、これを避けたいと思います。
ここで見落としている他の選択肢はありますか?
事前に感謝します。
編集
ユース ケースのいくつかのテストを作成した後、バイナリ データ オブジェクト (具体的には pytables または h5py を使用する hdf5) に別のファイル システムを使用することにしました。これらのバイナリ データ オブジェクトの永続性を除いて、すべてに引き続き mongo を使用します。このようにして、追加および更新タイプの操作に関連するパフォーマンスを、基本的な mongo パフォーマンスから切り離すことができます。
mongo 開発者の 1 人は、ドット表記と $set を使用して内部配列要素を設定できることを指摘しました (以下のコメントの参照を参照)。
さらに、mongo ドキュメント内に 2MB のバイナリ データ フィールドが 1,000 個あり、それらを頻繁に (少なくとも 5 分に 1 回) 更新および拡張している場合、私の直感は、mongo が多くのデータを管理する必要があることを教えてくれます。ディスク上のファイル内の割り当て/成長の問題 - そして最終的にはパフォーマンスの問題につながります。OSレベルで別のファイルシステムにオフロードして処理したいと思います。
最後に、numpy を使用してデータの操作と計算を実行します。pytables と h5py モジュールの両方を使用すると、numpy の動作とストアを適切に統合できます。