2009-07-30 7 views
1

[OK]を、私はメモリ内にキャッシュされた非常に大きな、同一のツリーのセットを持っている(同一ではないデータノード])。大きな(160000+内部オブジェクトツリー)オブジェクトのコピーを取得

ツリーの1つのインスタンスをコピーし、各コピーに個別のデータセットを取り込みたいとします。

しかし、現時点では、ツリーのキャッシュされた「空白」コピーはコピーされておらず、単純に参照され、すべての単一のデータセットで満たされます。

キャッシュされた空のツリーが参照ではなくオブジェクトのコピーを返すようにする方法を強制するにはどうすればよいですか?

+0

あなたのツリー構造を扱うためにどのようなクラスを使用し、そのクラスはICloneableインターフェイスをサポートしていますか? –

+0

これはカスタムツリークラスです。検索/分類の問題を最適化するために最初から構築されているため、スピードを重視して軽量でなければなりませんでした。各ツリーには160kノードを超えています。これは最適化されたバージョンです。それは10倍を超えるでしょう。したがって、それはicloneableをサポートするように設定されていません。 –

+1

私はあなたが他の答えに投稿したコメントを読んだので、あなたはいくつかを明確にする必要があると思う。あなたはコピーがほしいと言っていますが、元のツリーをコピーするのは面白くないと言っています。あなたは何をしたいのですか?このようなことをICloneableインターフェイスが行うための.NETの保存メカニズムはないので、最終的な結果に関係なくコードを記述する必要があります。ここであなたの質問は何ですか? –

答えて

2

Clone()の代わりに、メモリバイナリストリームでシリアル化し、新しいインスタンスとして逆シリアル化します。

EDITまた

、あなたはシリアル化を検討し、パフォーマンスは、あなたが主な関心事である場合には、も考慮に以下の性能試験Manual Serialization 200% + Faster than BinaryFormatterをしてくださいますならば。

+1

シリアライズまたは手動再帰コピーのいずれかが必要なパフォーマンスを提供しないと思われる場合は、C++アンマネージコードを使用してツリーをメモリに格納し、memcpyで効果的にコピーできるようにする必要があります。私は非常に貴重な提案をすることができる領域ではありません... –

0

いくつかの方法がありますが、ICloneableをツリーオブジェクトに実装してから、Clone()を呼び出してディープコピーを作成することをお勧めします。

+0

実際にICloneableを実装することは、通常はお勧めできません。 –

+0

その理由は何ですか?再帰的なディープコピーを実装する必要がある場合は、ドキュメント化されたインターフェイスを使用してください。 Clone()を実装する方法は問題ではありません。Object.MemberwiseCopyを実行したり、シリアライゼーションを使用したり、すべてのフィールドを自分で割り当てることができます。 – chris166

+0

@Chris:IClonableは目標を逃していますので、_no_longer_を推奨します。 –

0

私はあなたのツリークラスを注意深く見て、コピーのセマンティクスを強制するつもりならば、クラスの代わりにstructを使用してください。それ以外の場合はICloneableインターフェイスを使用して、clone()メソッドを提供します。これはchris166が示唆しているとおりです。

0

このような大きなツリーでは、複数のコピーを持つと、多くのメモリオーバーヘッドが発生します。なぜ、あなたは現時点で入手しているように、すべての異なるデータを保持するように、実際の必要性に都合の良い方法で編成されるように、各ノードのデータを(辞書などで)整理してみませんか?

+0

メモリのオーバーヘッドは、この場合、処理のオーバーヘッドよりも懸念の少ないです。各ノードにはすでにツリーの特定のデータセットのデータでいっぱいのディクショナリが含まれています。このデータを別のディクショナリに追加すると、ツリーを生成する際に処理が非常に大きくなります。 –

関連する問題