2016-07-04 9 views
1

プログラムをローカルで実行するために使用できるオプションを把握しようとすると、計算結果またはリモートソースからの計算結果が得られます。リモートで計算を保存/管理するためのC#テクノロジオプション

問題: 多くの計測器を読み込んでデータを収集するデータ収集アプリケーションがあります。このデータは、さまざまな形式の集計(最小、最大、平均など)を経ずに複数の計算よりも優先され、結果がデータベースに保存されます。このプロセスは、テスト中に数回発生します。このアプリケーションは、このテストを実行する専用マシン上で実行されますが、テスト外のユーザーは、実験、データ解析などのために同じ計算を実行する必要があります。

過去には、ユーザーとの関係)は、計算が変更されるたびに更新され、どこにでも展開されます。これは痛みです。

質問: 私はこの問題を解決するためのオプションを探しています。

私が今までに見つけたこと。

1)。 WCF。

Like: サーバーを更新するだけで、両方のプログラムが新しい計算を利用できるようになりました。

懸念: のDataContractの機能(複数可)に渡さなければならないいくつかのクラスが含まれます。 (「データ」の合計サイズは、状況に応じて1 MBから1 GBの範囲である可能性があります)。現時点でデータの量が実際の問題であるかどうかは不明です。

2)。コンパイルされたDLLを格納し、それらをダウンロード/ロードします。 サーバーにクラスライブラリを照会します。それをダウンロードしてください。メモリにロードし、計算を使用します。

同様: は前後に多くのデータを渡すために持っていません。

懸念:今一人ひとりのコンピュータ上に存在 DLL。人々は問題を引き起こすかもしれない正しいバージョンに更新するよう強制されないかもしれません。地元のコンピュータのDLLがセキュリティ上のリスクを引き起こす可能性があります。

+0

追加情報:機器をテストするためにアプリケーションを実行している間、計算のユーザーは1〜2人です。テストの外側には、大部分が計算の結果だけを見る10〜20人のユーザーの周りがあります。 (基本的にはデータベースに問い合わせる)。そのグループの中には、現在結果を再計算する能力を持つ小さなサブセットがあります。あなたは、彼らが現在、彼らが実際に彼らはおそらく機能... –

+0

この全体のプロセスを使用することはありませんにもかかわらず、であるよりも、それを戦うために傾向が行うことができます離れて何かを取る場合、私は、これはグループではなく、任意のユーザーで実行する頻度を知りませんさらに25回繰り返した。 IE)私はお互いに隔離された約25個のテストシステムを持っていますが、ツールのサポートを容易にするためにソフトウェアシステムを同じに保つようにしています。私は、各システムが独自のサーバーを持っているので、サーバーを停止することに心配していません。私は、ネットワークを通過するデータの量とアプリケーションの一般的な応答性にもっと関心を持っています。 –

答えて

0

のためであるか知っていることを確認しても、非常に大きなシフトです。代わりに私たちが必要とするすべての計算でDLLを動的にロードし、一連のインターフェースを使用して動作を定義することを選択しました。私が学んだし、見つかったきちんとした何

は、私は、データベース内のDLLを保存し、最初のための保護の追加レイヤを提供するハードドライブにコピーすることなく、メモリに直接それを読み込むことができるということです。 SQLとFILESTREAMの使用。また、私は、データベースからロードし、計算/様々な値を再計算するためにどのDLLのバージョンを選択することができるという点で、バージョン管理のようなものを提供します。

// Read in File 
using (SqlFileStream fileStream = new SqlFileStream(path, transaction, System.IO.FileAccess.Read)) 
{ 
     byte[] buffer = new byte[size]; 
     int bytesRead = fileStream.Read(buffer, 0, buffer.Length); 

     // Load Assembly 
     Assembly DLL = Assembly.Load(buffer); 

     Type myInterfaceType = DLL.GetType("MyNamespace.MyClass"); 

     // Get access to the root interface 
     IMyInterface myClass = (IMyInterface)Activator.CreateInstance(myInterfaceType); 

} 
0

これはかなり難しい質問です。私はあなたがそれを解決しようとする方法はかなりたくさんあると思います。ここでは、

  1. 使用Akka.Net

    を始めるとリモート配備の問題を解決することがありAkka.Remoteを見ても、いくつかのアイデアがあります。しかし、ユーザーが計算を配布する場所の固定セットを持つのではなく、アドホックにクラスタに参加することを決定した場合、これが必要なものに合うかどうかはわかりません。計算は、単純な数式であれば

  2. あなたは一連のルールとして保存し、数式をダウンロードすることができます。私。より多くのルールエンジンアプローチを採用しています。おそらくC# expression trees

  3. ブラウザベースの解決策を参照してください。これは、リモート展開の観点から容易に勝ちます。 JavaScriptを使用したくない場合は、多くのオプションがあります。JSIL /ブリッジとPureScript、F番号(フェイブル)、ClojureScipt、ELM及びおそらくはC#。ウェブにデスクトップから移動すると、あなたはあなたが私たちが前後にデータを送ることがあまりにも面倒であることがわかったいくつかのオプションを試した後:)

+0

また、ローカルとリモートのどちらが本当に必要なのかによって多くのものが異なると思います。私があなたの質問から明らかにならないのは、ローカルとリモートの両方を計算する必要があることです。各ユーザは集約データだけを必要としますか?もしそうなら、実際に計算をしたり、結果を見たりする必要がありますか?リモートCALCSがある場合は、WCF /サービスベースのアプローチは、サーバーは、多くの仕事をしていることになるだろうと多くのデータを送信されることを意味します。ある時点でそれも考慮に入れる必要があります – Andre

+0

これまでの情報をありがとう。私はAkka.Remoteでもう少し読書をしなければならないだろう。 (私はLabVIEWでよく知っているアクターフレームワークのように見えます)。計算が複雑すぎるため、C#式ツリーは機能しません。回帰、ルックアップテーブル、4次多項式など(私はTurbine Enginesの性能を計算しています)。私はブラウザのソリューションを考えてきましたが、チームはこの時点でその方向を変えるのは快適ではありません。 –

+0

うん、ブラウザベースに移動すると、大きなステップです:)もう一つのオプションは、グリッド/メッシュ・コンピューティング・ソリューションを見ることです。また、クライアントを利用可能にすることができるかどうか、または結果を見るために臨時に参加することができるかどうかにもよります。とにかく幸運は、好きで面白い問題を抱えています。 – Andre