1

C++ データを保存およびロードする最良の方法を知りたいです。私は主に、シミュレーションで使用するクラスと行列 (スパースではない) を保存することに関心があります。今はそれらをtxtファイルとして保存するだけですが、メンバーをクラスに追加すると、データをロードする関数を変更する必要があります(txtファイルの値を解析してチェックする必要があります)、そうではないと思います理想。

一般的に何をお勧めしますか?(psコードをリリースしたいので、再配布できる標準のc ++またはライブラリのみを使用したいのですが)。

4

3 に答える 3

1

この場合、「最善」はありません。あなたにとって何が最善かは、あなたの状況に大きく依存します。しかし、あなたの詳細と、このうさぎの穴がどれだけ深くなるかについて考えさせるための例を挙げましょう.

疑問の余地なく最速の保存が絶対に必要な場合 (そして代償を払う意思がある場合) は、独自のメモリ管理を定義して、すべてのオブジェクトを共通の型 (整数など) の連続した配列に入れることができます。これにより、その配列をバイナリ データとしてディスクに非常に高速に書き込むことができます。これは、スレッドを効率的に使用してすべてのコア/プロセッサをロードしてリアルタイムで実行するシミュレーションで必要になる場合があります。

なぜかなり恐ろしい解決策なのですか?「最適化」という名の下に、多くの作業が必要であり、多くの問題のリスクを冒しているからです。

  1. 独自のメモリ管理 (演算子 new() および演算子 delete()) を構築する必要があり、スレッド セーフである必要がある場合があります。
  2. この配列からロードしようとする場合は、すべての仮想ポインターが適切に設定されるように、一意の非変更コンストラクターを使用して新しいすべてのオブジェクトを配置する必要があります。ああ、これを行うには、各アドレスのタイプを追跡する必要があります。
  3. 他のシステムとの移植性およびバイナリのバージョン間での移植性のために、バイナリ形式からクロス プラットフォームに対応できる一般的な形式に変換するユーティリティが必要です (他のオブジェクトへのポインタの再設定を含む)。

私はこれをしました。非常に不愉快でした。まだ問題があることは間違いありません。ここにリストしたのはほんの一部です。しかし、それは非常に速く、非常に問題がありました。

ニーズに合わせて設計する必要があります。一般的に、最初のニーズは「機能させる」ことです。効率は気にしないでください。正確に持続するものと、それを実行するための情報を知っていて、ある時点でアクセスできることだけが重要です。また、保存と読み込みのプロセスをカプセル化する必要があります。次に、「より良くする」必要が生じた場合は、そのコードを 1 ビット変更するだけで、残りは機能するはずです。すべてのユーザーに対して想定しなければならないニーズではなく、ユーザーのニーズに応じて保存形式を選択できるようにすることもできます。

リストされているすべての仮定、長所と短所を考えると、この質問に対する特定のニーズを詳しく説明できるはずです.

于 2012-09-16T14:27:17.323 に答える
0

パフォーマンスが問題ではないことを考えると (これは回答の重要な部分です)、Boost Serialization ライブラリは優れた回答です。

コメント内のリンクはドキュメントにつながります。チュートリアルを読んでください (これはあなたが最初に望んでいたものにはやり過ぎですが、それだけの価値はあります)。

最後に、ほとんどが配列行列であるため、保存と読み込みのプロセス全体をカプセル化して、後で変更する必要がある場合に備えて、新しい実装を作成し、既存のものから選択します。ブースト シリアライゼーションのスマートさに eddedmtime を費やすのは素晴らしいことではありません。ただし、将来の要件によって、他の何かまたは複数の何かに移動する場合があります。

于 2012-09-17T13:59:24.220 に答える
0

C++ Middleware Writerは、マーシャリング関数の作成を自動化します。クラスにメンバーを追加すると、マーシャリング関数が更新されます。

于 2012-09-17T15:18:01.100 に答える