bSONObjオブジェクトをstd :: vectorに保存すると、大きなドキュメントでクラッシュします

fgalan

クエリカーソルからBSONドキュメントを蓄積し、後で処理する次のコードフラグメントがあります。

// Accumulate
std::vector<BSONObj> results;
while (cursor->more()) {
  BSONObj r = cursor->nextSafe();
  results.push_back(r);
}
...
// Process it (example)
for (unsigned int ix = 0; ix < results.size(); ix++) {
  BSONElement be = results[ix].getField("_id");
  // Do somtething with 'be'
  ...
}

このコードはしばらくの間(数か月)はうまく機能していましたが、最近、DB内の大きなドキュメント(約results[ix].getField("_id")1.1MB )で、ステートメントがsegfaultでクラッシュすることがわかりました。これはバックトレースのトップです:

(gdb) bt
#0  readNative<int> (offset=0, t=<synthetic pointer>, this=<optimized out>) at src/mongo/base/data_view.h:46
#1  readNative<int> (offset=0, this=<optimized out>) at src/mongo/base/data_view.h:53
#2  readLE<int> (offset=0, this=<optimized out>) at src/mongo/base/data_view.h:59
#3  objsize (this=0x7f74340022e0) at src/mongo/bson/bsonobj.h:309
#4  BSONObjIterator (jso=..., this=<synthetic pointer>) at src/mongo/bson/bsonobjiterator.h:42
#5  mongo::BSONObj::getField (this=0x7f74340022e0, name=...) at src/mongo/bson/bsonobj.cpp:635
...

results.push_back(r.copy())代わりにを使用して問題を解決しましたresults.push_back(r)したがって、おそらくエラーは、rオブジェクトがwhileブロックスコープの最後で破棄され、コピーが不安定な状態でベクターにプッシュバックされたときに発生しました。r新しい変数としてブロックスコープにヒットせずにのコピーをプッシュバックすると、問題が解決するようです。

だから、私は次の質問があります:

  1. クエリ結果から取得したBSONObjを格納する最良の方法は何std::vectorですか?私は合理的な解決策を見つけたと思いますが、これが最良の解決策であるかどうかはわかりません。

  2. 使用するコードpush_back(r)が小さなドキュメントで機能するのはなぜですか?ブロックスコープの最後でのr.copy()破壊の問題を回避するために正しい方法を使用する場合、約1.1MBのオブジェクトの場合だけでなく、常に失敗するはずだと理解しています。rwhile

私はMongoDBC ++ドライバーlegacy-1.0.7を使用しています(それが役立つ場合や、問題がMongoDB C ++ドライバーの特定のバージョンに関連している可能性がある場合)。

DHW

nextSafeによって返されるBSONObjオブジェクトはデータを所有しておらず、nextSafeへの後続の呼び出しによって無効になります。

したがって、ベクターには無効なBSONObjオブジェクトが入力されます。

代わりに、ベクトルをプッシュバックする前に、カーソル結果に対してBSONObj :: getOwned()を呼び出します。

AddressSanitizerまたはvalgrindでプログラムを実行すると、ほぼ確実に解放後使用タイプのエラーが表示されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

mongodbに大きなオブジェクトを含む複数のドキュメントまたは少ないドキュメントを保存する方が良いですか?

分類Dev

すべてのドキュメントとコレクションを削除するときに、firestoreが保存されているバイトとオブジェクトを削除しないのはなぜですか?

分類Dev

新しいドメインオブジェクトを保存すると、すぐにフラッシュされます

分類Dev

FirebaseクラウドFirestoreは、ドキュメント参照をオブジェクト参照ではなく文字列として保存しています

分類Dev

オブジェクトをキャッシュに保存する

分類Dev

オブジェクトの大きなリストをappfabricキャッシュに保存できません。どうすればよいですか?

分類Dev

Varnishでオブジェクトをキャッシュするが、クライアントにキャッシュしないように指示する方法

分類Dev

クリティカルセクションオブジェクトをstd :: vectorに保存できますか?

分類Dev

FirebaseドキュメントオブジェクトをSwiftオブジェクトとして取得する

分類Dev

window.URL.createObjectURLで作成したオブジェクトのターゲットドキュメントを変更することはできますか?

分類Dev

ハッシュできないオブジェクトを保存する方法

分類Dev

push_backでオブジェクトをコピーしないようにポインタの配列をstd :: vectorにプッシュする

分類Dev

Mongooseのサブドキュメントのサブドキュメントにオブジェクトをプッシュしますか?どうすればそれができますか?

分類Dev

クラスのコピーコンストラクタを作成すると、デストラクタでオブジェクトを削除しているときに予期しないクラッシュが発生します

分類Dev

Python Flask / GeventWebサービスで大きなオブジェクトをキャッシュする

分類Dev

mongodbドキュメントをドメインオブジェクトにシリアル化します

分類Dev

nullオブジェクトポインタのデータにアクセスしないメソッドを呼び出すと、機能する場合とクラッシュする場合があります。なぜいつもクラッシュしないのですか?

分類Dev

Python VMは、自動的に解放できない整数オブジェクトをキャッシュしますか?

分類Dev

クラスオブジェクトをxmlドキュメントにシリアル化する方法

分類Dev

ジェネリックメソッドパラメータを使用してハッシュ可能なトレイトオブジェクト/トレイトオブジェクトを作成するにはどうすればよいですか?

分類Dev

サブドキュメント内で特定の条件が一致するネストされたmongodbドキュメントに新しいオブジェクトをプッシュします

分類Dev

大きなドキュメント用語マトリックス-ドキュメントの文字数をカウントするときのエラー

分類Dev

大きな文字列で入力をバインドすると、Vueがクラッシュします

分類Dev

オブジェクトを配列にプッシュするとき、同じオブジェクトをプッシュしない方法は?

分類Dev

FirestoreドキュメントをプレーンなJavascriptオブジェクトとして取得しますか?

分類Dev

std :: functionから派生したオブジェクトを参照で渡すと、プログラムがクラッシュするのはなぜですか?

分類Dev

mongodbの別のオブジェクトにオブジェクトをプッシュするときにエラーが発生しました

分類Dev

DirectXオブジェクトをstd :: queueにプッシュする

分類Dev

私のTYPO3CMS 6.2 Extbase拡張機能は、複数のコントローラーとアクションメソッドおよび永続性の間でオブジェクトを渡すときにクラッシュします

Related 関連記事

  1. 1

    mongodbに大きなオブジェクトを含む複数のドキュメントまたは少ないドキュメントを保存する方が良いですか?

  2. 2

    すべてのドキュメントとコレクションを削除するときに、firestoreが保存されているバイトとオブジェクトを削除しないのはなぜですか?

  3. 3

    新しいドメインオブジェクトを保存すると、すぐにフラッシュされます

  4. 4

    FirebaseクラウドFirestoreは、ドキュメント参照をオブジェクト参照ではなく文字列として保存しています

  5. 5

    オブジェクトをキャッシュに保存する

  6. 6

    オブジェクトの大きなリストをappfabricキャッシュに保存できません。どうすればよいですか?

  7. 7

    Varnishでオブジェクトをキャッシュするが、クライアントにキャッシュしないように指示する方法

  8. 8

    クリティカルセクションオブジェクトをstd :: vectorに保存できますか?

  9. 9

    FirebaseドキュメントオブジェクトをSwiftオブジェクトとして取得する

  10. 10

    window.URL.createObjectURLで作成したオブジェクトのターゲットドキュメントを変更することはできますか?

  11. 11

    ハッシュできないオブジェクトを保存する方法

  12. 12

    push_backでオブジェクトをコピーしないようにポインタの配列をstd :: vectorにプッシュする

  13. 13

    Mongooseのサブドキュメントのサブドキュメントにオブジェクトをプッシュしますか?どうすればそれができますか?

  14. 14

    クラスのコピーコンストラクタを作成すると、デストラクタでオブジェクトを削除しているときに予期しないクラッシュが発生します

  15. 15

    Python Flask / GeventWebサービスで大きなオブジェクトをキャッシュする

  16. 16

    mongodbドキュメントをドメインオブジェクトにシリアル化します

  17. 17

    nullオブジェクトポインタのデータにアクセスしないメソッドを呼び出すと、機能する場合とクラッシュする場合があります。なぜいつもクラッシュしないのですか?

  18. 18

    Python VMは、自動的に解放できない整数オブジェクトをキャッシュしますか?

  19. 19

    クラスオブジェクトをxmlドキュメントにシリアル化する方法

  20. 20

    ジェネリックメソッドパラメータを使用してハッシュ可能なトレイトオブジェクト/トレイトオブジェクトを作成するにはどうすればよいですか?

  21. 21

    サブドキュメント内で特定の条件が一致するネストされたmongodbドキュメントに新しいオブジェクトをプッシュします

  22. 22

    大きなドキュメント用語マトリックス-ドキュメントの文字数をカウントするときのエラー

  23. 23

    大きな文字列で入力をバインドすると、Vueがクラッシュします

  24. 24

    オブジェクトを配列にプッシュするとき、同じオブジェクトをプッシュしない方法は?

  25. 25

    FirestoreドキュメントをプレーンなJavascriptオブジェクトとして取得しますか?

  26. 26

    std :: functionから派生したオブジェクトを参照で渡すと、プログラムがクラッシュするのはなぜですか?

  27. 27

    mongodbの別のオブジェクトにオブジェクトをプッシュするときにエラーが発生しました

  28. 28

    DirectXオブジェクトをstd :: queueにプッシュする

  29. 29

    私のTYPO3CMS 6.2 Extbase拡張機能は、複数のコントローラーとアクションメソッドおよび永続性の間でオブジェクトを渡すときにクラッシュします

ホットタグ

アーカイブ