2017-01-09 15 views
0

アプリケーションを制御するために、CSharpScriptインスタンスを多数使用しているアプリケーションがあります。私が直面している問題は、メモリ使用量が、使用しているグローバルオブジェクトの種類に大きく依存することです。グローバルタイプがアプリケーションアセンブリ(巨大アセンブリ)で定義されている場合、コンパイルされたスクリプトごとに約100MBのメモリ使用量が増加します。代わりにグローバルタイプを別のアセンブリに入れると、各スクリプトのメモリー使用量が〜10MB増加することがわかります。これは、使用しているスクリプトの量にはまだまだ多くあります。CSharpScriptインターフェイスを使用したメモリの使用制限

CSharpScript APIを使用する場合、このメモリ使用を制限する方法はありますか?

答えて

1

ここでは、あなたのスクリプトがメインアプリケーションで定義されたオブジェクトを直接参照していると考えています。スクリプトは別のAppDomainにコンパイルされているため、AppDomainはメインアプリケーションのAppDomainから独自のローカルコピーを取得します。あなたは100sのスクリプトを持っているので、それぞれ独自のAppDomainにあなたのメインアセンブリが100回ロードされます。

これを回避する1つの方法は、スクリプトとアプリケーションの間のインターフェイスに、シムオブジェクトを通過させることです。これは、小さなクラスで、独自のアセンブリで定義され、AppDomain境界。 ShimクラスはMarshalByReferenceObjectから継承する必要があります。これはシムがアプリケーションで定義されたクラスのどれにも合格できないか、前と同じようにメインアセンブリを「吸い込む」ため、扱いにくく複雑なことがあります。すべてが.NETで定義されたクラスとして渡されなければなりません。

基本クラスとしてMarshalByReferenceObjectを使用すると、アセンブリのコピー全体を取り込まずにシムがドメイン境界を越えることができます。詳細については、私はあなたの特定の実装であるかわからないが、あなたはこれを行うすることが可能かもしれない https://msdn.microsoft.com/en-us/library/system.marshalbyrefobject(v=vs.110).aspx#Remarks

+0

私はこれを試して、非常に細いグローバルクラスを別のアセンブリで使用することは確かに大きな違いですが、スクリプトインスタンスあたり〜10MBのメモリ使用量が見られます。あなたがスクリプトの数が多い場合は多く、私の場合は解決策ではありません。 – Chrille

+1

'AppDomain.Current.Assemblies'をループすることによって、あなたの' AppDomain'に余分なアセンブリが引っ張られているかどうか確認することができます。あなたのメインアプリケーションから何かが表示された場合は、これを機能させるために削除する必要があるものを直接参照しています。 –

0

で見つけることができます:

代わりの大きな重いグローバルオブジェクトを使用してスクリプトにデータを与えますグローバルとしてHeavyObjectに代わり、このCSXファイルの

、:、スクリプトがあなたのアプリケーションにのみ、そのロジックを与えてみましょうことができ

// script.csx: 
HeavyObject.DoSomeWork(); 

はあなたがいないGLと、このCSXを書くことができますobal paramが必要:

// betterscript.csx: 
public class ScriptWork : IHaveWork 
{ 
    Work(HeavyType obj) 
    { 
     obj.DoSomeWork(); 
    } 
} 
return new ScriptWork(); 

アプリでこのインターフェースが必要です。

public interface IHaveWork 
{ 
    void Work(HeavyType obj); 
} 

を、スクリプトがアプリケーションを参照して実行する必要があります。 スクリプトからIHaveWorkのインスタンスを受け取ると、アプリケーション内でWorkを呼び出す必要があります。

+0

これは確かにいくつかの解決策になるかもしれませんが、私は異なるグローバルクラスのいくつかのプロパティに直接セット/アクセスする必要があります。 – Chrille

+0

名前空間を参照する場合は、スクリプトからすべての公開プロパティにアクセスする必要があります。 – idanp

関連する問題