3

C ++、Java、Pythonで、プログラムの状態を保存できる方法はありますか?質問はありませんか?たとえば、私は1時間かけて、木のような構造をファイルに保存する方法を学びました。非常に教育的ですが、私はただできると感じています:

saveState(file);

そして、「ファイル」には、私のプログラムが使用するメモリ全体が含まれます。オペレーティングシステムの「休止状態」または「ディスクへのサスペンド」機能と同じです。私はブーストシリアル化について知っています、これはおそらく私が探しているものではありません。

4

5 に答える 5

2

最も必要なのは、シリアル化またはオブジェクトマーシャリングと呼ばれるものです。簡単にグーグルで検索できるデータ/オブジェクトのシリアル化には、学術的な問題がたくさんあります。

そうは言っても、適切なライブラリ(おそらく非常にネイティブ)があれば、「OS固有の休止状態」と同じように実行中のプログラムの真のスナップショットを作成できます。Linuxでそれを行うためのSOの答えは次のとおりです:https ://stackoverflow.com/a/12190830/318174

上記のスナップショットを実行するには、保存するプロセスの外部プロセスが必要になる可能性があります。そうしないことを強くお勧めします。代わりに、選択した言語で読み取り/ルックアップします(SOへようこそ、すべての言語にタグを付けないでください...人々を怒らせます)シリアル化またはオブジェクトマーシャリングの方法...ヒント...最近のほとんどの人はJSONを選択します。

于 2013-02-28T13:33:43.740 に答える
1

これがあなたの問題です:

古代の歴史(エクステンダーを備えた16ビットDOSプログラム)に戻ると、コンパイラーは、相対アドレスを格納する「ベースの」ポインターをサポートするために使用されていました。これらはまとめてシリアル化しても安全でした。そして、アプリケーションはそうし、コードとデータの両方を保存し、シリアル化されたモジュールは「オーバーレイ」と呼ばれていました。

今日では、ツールチェーンでベースのポインターサポートが必要になります(すべてのポインターアクセスに追加の調整が必要になります)。または、すべてのデータを調べて、ポインターを他のデータと区別し(どのように?)、新しいものに調整する必要があります。古いプログラムがヒープに使用していたのと同じアドレスにOSがすでにライブラリをロードしている場合の保存場所。ガベージコレクターのポインターを既に識別しなければならない最新の「管理された」環境では、これは一般的に行われていなくても実行可能です。ネイティブコードでは、共有ライブラリの再配置を可能にするためにメタデータが作成されますが、それは非常に困難です。

そのため、代わりに、データ構造全体を手動でウォークし、オブジェクトに新しいアドレスがある場合でも、オブジェクトリンク(ポインター)をもう一方の端で復元できるものに変換することになります(これも、古いアドレスが共有ライブラリ)。

多くのプロセッサにはベースアドレス指定をサポートする機能があることに注意してください...ベースアドレス指定はもはや一般的ではないため、コンパイラは先に進み、これらのポインタ演算機能を使用してユーザーコードを高速化しました。

于 2013-02-28T02:48:28.043 に答える
1

あなたが説明するのは、実際のシステムで実際に使用したいと思う人はほとんどいない機能だと思います。通常、何かを保存して送信できるようにしたり、プログラムの実行を停止したり、プログラムが終了する(または電源が落ちた)可能性を防ぐことができます。

ほとんどの本番システムでは、システムの応答性を維持し、一貫性のないデータの書き込みを回避できるように、ディスクへの書き込みを小さく増分的にしたいと考えています。すべてのメモリを定期的にディスクに書き込むと、応答時間が長くなる可能性があります。一貫性のない状態を回避するには、システム全体をロックする必要があります。

独自の永続性を作成するのは面倒でエラーが発生しやすいため、このSOの質問に関心があるかもしれません:永続化グラフデータ(Java)

于 2013-02-28T01:22:54.150 に答える
1

これにはいくつかのフレームワークがあります。Java、Python、およびC ++のサポートが必要な場合は、Google ProtocolBuffersを確認して ください。https://developers.google.com/protocol-buffers/ いくつかのプロジェクトで使用しましたが、うまく機能します。

Thrift(元々はFacebookから)もあり ますhttp://thrift.apache.org/ 私はそれについての経験はありません。

もう1つのオプションは、@QuentinUKが提案するものです。ストリーミング可能なものから継承するクラスを使用するか、ストリーミング可能な演算子/関数を作成します。

フレームワークを使用します。

于 2013-02-28T02:41:20.897 に答える
0

はい、ストリーミング可能なクラスからオブジェクトを派生させ、ストリーミング関数を追加します。次に、すべてをディスクにストリーミングできます。このために、MFCなどのライブラリが必要になります。

于 2013-02-28T01:22:40.357 に答える