問題タブ [expandoobject]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - TPL タスク + 動的 == OutOfMemoryException?
私はストリーミング twitter クライアントで作業しています。1 ~ 2 日間連続して実行した後、メモリ使用量が 1.4 ギガ (32 ビット プロセス) を超えており、その量に達するとすぐにメモリ不足になります。基本的にこれであるコードの例外 (このコードは、私のマシンでは 30 秒以内にエラーになります):
私はそれをプロファイリングしましたが、それは間違いなく DLR のクラスがかなり下にあるためです (メモリから - ここには詳細な情報はありません) xxRuntimeBinderxx と xxAggregatexx です。
Eric Lippert (microsoft) からのこの回答は、コード内の何も参照されていないにもかかわらず、GC が実行されない舞台裏でオブジェクトを解析する式を作成していることを示しているようです。
その場合、上記のコードにそれを防止または軽減する方法はありますか?
私のフォールバックは、動的な使用法を排除することですが、そうしないことを好みます。
ありがとう
アップデート:
12/14/12:
答え:
この特定の例でタスクを解放する方法は、yield (Thread.Sleep(0)) でした。これにより、解放されたタスクを GC で処理できるようになります。この特定のケースでは、メッセージ/イベント ループの処理が許可されていなかったと思います。
私が使用していた実際のコード(TPL Dataflow) では、ブロックでComplete()を呼び出していませんでした。これは、ブロックが終わりのないデータフローであることを意図していたためです。タスクは、Twitter が送信する限り Twitter メッセージを受け取ります。このモデルでは、アプリが実行されている限りブロックは決して完了しないため、ブロックのいずれかが完了したことを通知する理由はまったくありませんでした。
残念ながら、Dataflow ブロックは、送信されたすべてのものへの参照を実際に保持しているため、非常に長時間実行したり、膨大な数のアイテムを処理したりするように設計されていないようです。私が間違っている場合は、お知らせください。
したがって、回避策は定期的に(メモリ使用量に基づいて-私の場合は100kのTwitterメッセージごとでした)ブロックを解放し、再度設定することです.
このスキームでは、メモリ消費量が 80 メガを超えることはなく、ブロックをリサイクルして適切な測定のために GC を強制した後、gen2 ヒープは 6 メガに戻り、すべてが正常に戻ります。
10/17/12:
- 「これは何の役にも立たない」 : この例は、単に問題を迅速に生成できるようにするためのものです。問題とは関係のない数百行のコードから要約されています。
- 「タスクを作成し、次にオブジェクトを作成する無限ループ」: 覚えておいてください-これは問題を簡単に示しているだけです-実際のコードはそこに座って、さらにストリーミングデータを待っています. また、コードを見ると、すべてのオブジェクトがタスクの Action<> ラムダ内に作成されています。範囲外になった後、(最終的には) クリーンアップされないのはなぜですか? この問題は、実行が速すぎることによるものでもありません。実際のコードでは、メモリ不足の例外に到達するのに 1 日以上かかります。これにより、物事を試すのに十分な速さになります。
- 「タスクは解放されることが保証されていますか?」オブジェクトはオブジェクトですね。私の理解では、スケジューラはプール内のスレッドを使用しているだけであり、実行中のラムダは、実行が完了した後に破棄されます。
c# - UI が ExpandoObject のリストで更新されない
このリンクをたどって、動的な dataGrid を実装しました。
Converter を使用して からの値をバインドしていますExpandoObject
。列には、学校の合計ユニット数などの値が表示されます。
学校はいつでも動的に追加できます。ここで、School4 を 40 ユニットで追加すると、デフォルトの学校 (DefaultSchool = 60、School4 = 40) から同じものを差し引きます。
コンバーターでこの計算を行うことができ、ItemsSource にも更新された値が表示されますが、UI には反映されません。
で TextBox のLostFocus
イベントを使用するとMyDataGrid.Items.Refresh
、UI が更新されますが、フォーカスが失われるたびに、Web ページが更新されるように UI がちらつきます)。
現在の行を更新するだけです。私は を使用してExpandoObject
いるため、 を使用することはできませんINotifyPropertyChanged
(私は信じていますか?)。このシナリオでは、どのようなアプローチが最適でしょうか?
では、UI を更新するにはどうすればよいでしょうか。
c# - ドット表記またはインデックスを使用してDynamicModel.Queryにアクセスします
Massivemicro-ormとSQLServer2008R2を.NETFramework4.0で使用しています。
と別のクラス...
User.FirstNameやUser["FirstName"]などのUser動的オブジェクトにアクセスしたいと思います。それは可能ですか、それとも私は何かを逃していますか?
どんな入力でも大歓迎です。
ありがとう。
.net - ExpandoObject へのバインディング。PropertyChanged が機能しない
私の Windows ストア アプリには、ExpandoObjects が入力されたリストがあります。データ バインディングは初期値に対しては正常に機能しますが、ファイルのダウンロード後に非同期で設定した画像プロパティに対しては機能しません。
ExpandoObject の PropertyChanged イベントに接続すると、すべてのオブジェクトに対してイベントが発生することが確認されます。新しいプロパティがオブジェクトに添付され、値は正しいですが、ListView 内の項目は完全には更新されません。
リストには 14 個のオブジェクトが含まれています。ExpandoObjects の代わりに通常の型付きオブジェクトを使用し、image プロパティの同じ非同期設定を使用すると、14 個のオブジェクトの一部がビューで更新されます (現在表示されていないオブジェクト)。クラスに INotifyPropertyChanged を実装すると、14 個すべてが更新されます。ExpandoObjects を使用すると、INPC を使用しない型付きオブジェクトとまったく同じ動作が得られます。現在表示されていないアイテムが更新されます。
そのため、PropertyChanged は ExpandoObject とデータ バインディングで機能していないようです。
WPF では意図したとおりに機能しますが、ストア アプリでは機能しません。比較を見る: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1
c# - ネストされたプロパティを ExpandoObject に動的に追加する
ExpandoObject に変換したい JSON オブジェクト (複数レベルの JSON 配列などを含む場合があります) を取得しています。
IDictionary を実装しているため、実行時に単純なプロパティを ExpandoObject に追加する方法を理解しましたが、実行時に正しく解決されるネストされたプロパティ (たとえば、 のようなものmyexpando.somelist.anotherlist.someitem
)を追加するにはどうすればよいですか?
編集:現在、これは単純な(最初のレベルの)プロパティでうまく機能します:
問題は、名前をネストして、それに応じて ExpandoObject を解決する方法です。
python - Pythonで新しい不明または動的/拡張オブジェクトを作成する方法
Pythonで、事前定義されたクラスを持たずに新しいオブジェクトを作成し、後で動的にプロパティを追加するにはどうすればよいですか?
例:
それを行うための最良の方法は何ですか?
編集多くの人がコメントで私がこれを必要としないかもしれないとアドバイスしたので。
問題は、オブジェクトのプロパティをシリアル化する関数があるということです。そのため、コンストラクターの制限があるため、期待されるクラスのオブジェクトを作成したくありませんが、代わりに同様のオブジェクトを作成します。たとえば、モックのように、必要な「カスタム」プロパティを追加して、フィードバックします。関数。
c# - 配列から読み取られたプロパティを使用してExpandoObjectsのリストを作成する
ファイルからオブジェクトを読み取るまで、オブジェクトがどのようなプロパティを持つかわからないため、オブジェクトの動的リストを作成しようとしています。
したがって、オブジェクトのプロパティが配列内にあるとします(FirstName、LastName、Emailなど)。
上記のプロパティを使用して、Recipientという動的オブジェクトを作成したいと思います。次に、リストを作成し、これらのオブジェクトのいくつかをそのリストに追加します。
これまでに次のことを行いましたが、これが動的オブジェクトにプロパティを割り当てる正しい方法かどうかはわかりません(「フィールド」は配列の名前です)。
上記のプロパティを使用して受信者オブジェクトを作成し、それらの受信者を個人リストに追加するにはどうすればよいですか?
c# - C# では、ExpandoObject からプロパティを削除するにはどうすればよいですか?
このオブジェクトがあるとします:
foo.bang
たとえば、 どのように削除しますか?
プロパティの値を単純に null に設定したくはありません。目的のために、プロパティを完全に削除する必要があります。また、最初から kv ペアを描画することでまったく新しい ExpandoObject を作成できることも認識していますが、それはかなり非効率的です。
c# - dynamic キーワードを適切に使用するために手動で ExpandoObject を作成する必要があるのはなぜですか?
Use 'dynamic' throw a RuntimeBinderExceptionという質問を見ていました。私は同様の問題に直面しています:
基本的に、動的引数を使用する ASP.NET MVC で "HTML ヘルパー" を作成したいと考えています。これは、多くの既存のヘルパーの htmlArguments パラメーターに似ています (詳細は以下のコード)。
意見:
ただし、素朴なアプローチでは、_args変数をデバッグしてホバリングすると、明らかにPositionプロパティがあるにもかかわらずRuntimeBinderException
、それを宣言して投げ出されます。'object' does not contain a definition for 'Position'
呼び出し元と呼び出し先は別のアセンブリにあります。なぜその問題が起こっているのですか?
(その解決策は、同じ質問に示されています:手動で ExpandoObject を作成して引数を保持します。)
実装:
[「明らかに」Positionプロパティが設定されているときに問題が発生することを明確にするために編集。プロパティが最初から定義されていない場合は、例外を発生させる必要があることを認識しています。]