問題タブ [capnproto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# を使用して、非常に大きなアイテム リストを Azure Blob Storage にシリアル化する
後で保存して取得する必要があるオブジェクトのリストがたくさんあります。リストは常に 1 つの単位として使用され、リスト アイテムは個別に取得されません。リストには約 7000 個のアイテムが含まれており、合計で約 1 GB になりますが、簡単にその 10 倍以上にエスカレートする可能性があります。
BinaryFormatter.Serialize()
シリアライゼーションを行うために使用しています( System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
)。次に、この文字列が BLOB として Azure BLOB ストレージにアップロードされました。一般的に高速で効率的であることがわかりましたが、より大きなファイル サイズでテストしてOutOfMemoryException
. 私が理解していることから、私はストリームを使用していますが、私の問題はBinaryFormatter.Serialize()
、ブロブをアップロードする前に、メソッドが最初にすべてをメモリにシリアル化する必要があり、例外が発生することです。
バイナリ シリアライザーは次のようになります。
行で OutOfMemoryException が発生しformatter.Serialize(stream, value)
ます。
したがって、別のプロトコルである Protocol Buffers を使用しようとしました。Nuget パッケージの protobuf-net と Google.Protobuf の両方の実装を使用してみましたが、シリアル化は恐ろしく遅く (約 30 分)、私が読んだところによると、Protobuf は 1 MB を超えるデータのシリアル化には最適化されていません。それで、私は製図板に戻って、Cap'n Proto に出会いました。Cap'n Proto は、メモリ マッピングを使用して速度の問題を解決すると約束しました。@marc-gravell の C# バインディングを使用しようとしていますが、プロジェクトにはまだ完全なドキュメントがないため、シリアライザーの実装に問題があります。さらに、Cap'n Proto がプロトコルの正しい選択であると 100% 確信しているわけではありませんが、オンラインで代替案を見つけるのに苦労しています.
非常に大規模なアイテムのコレクションを、メモリの問題を発生させることなく、かなり高速な方法で BLOB ストレージにシリアル化するにはどうすればよいですか?
c++ - byte[] を capnp::Data に取得する方法
公式 Web サイトには、C++ シリアライゼーションに CapnProto を使用する方法の、比較的包括的な例があります。欠けているのは、2 番目の Blob タイプを処理する方法capnp::Data
だけcapnp::Text
です。
完全を期すために、スキーマ言語がブロブ型について述べていることを次に示します。
ブロブ: テキスト、データ
...
テキストは常に UTF-8 でエンコードされ、NUL で終了します。
データは完全に任意のバイト列です。
したがって、次のスキーマがある場合
このようにメッセージを作成し始めることができます
この時点で行き詰まりました。私はこれを行うことはできません:
だから私は少しいじって、 capnp::Data がラップしているのを見ましたがkj::ArrayPtr<const byte>
、どうにかして を手に入れることができませんでしたArrayPtr
。
型のデフォルト値Data
(つまりpayload @5 :Data = 0x"a1 40 33";
) を設定する方法があることがわかりましたが、この場合、スキーマ言語は実際には C++ に変換されないため、これも役に立ちませんでした。
ここで私が見逃していることを誰かが指摘できれば幸いです。また、スキーマのペイロードとしてではList(Data)
なく、これを行うにはどうすればよいですか?Data
c++ - ZMQ 経由で capnp メッセージを送信できません
次のコードがあり、ZMQ 経由で capnp メッセージを送信しようとしています:
パブリッシュ/サブスクライブ パターンを使用していますが、次のエラーが発生します。
c++ - Cap'n Protoでバイト配列を読み書きするための適切な構文?
配列があるとしましょう:
そして、私はスキーマで次のようにしています:
このフィールドを読み書きする適切な方法は何ですか? 配列の周りにcapnp::Data::Readerをラップし、ビルダーの setValue() を使用できるはずですが、構文は実際には明らかではありません。
もう一方の方法もやや神秘的です。デシリアライズ時に配列を設定するにはどうすればよいですか? 私の現在のアプローチには memcpy が含まれていますが、それを行うには Cap'n Proto の方法があると思います。
python - エラー: pip install pycapnp
Macbook Proにpip経由でpycapnpをインストールしようとしています。しかし、ダウンロードしようとすると問題が発生するようです。
エラーは次のとおりです。
どんな助けでも大歓迎です。ありがとうございました!