問題タブ [object-pooling]
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.
java - ObjectPoolのスタックまたはLinkedList?
これに対する正しい答えは、プールされたオブジェクトのタイプとワークロードに依存すると確信しているので、実装について少し詳しく説明します。
長時間実行されるコマンドラインプロセスをプールするために使用されるObjectPoolがあります。これらのプロセスはstdin/stdoutを介して通信し、ファイル/ネットワーク操作を実行します。多くのタスクは他のタスクよりもはるかに速く完了し、プロセスをプールにすばやく戻すことができます。プールへのすべてのアクセスはスレッドセーフである必要があります。
私の質問は、LIFO/スタックまたはFIFO/ ConcurrentLinkedQueueでプールを管理する方が良いですか?両側の私の推論:
- スタックは、リソースがキャッシュされたままになる可能性がある「ホット」オブジェクトを再生し続けます。長いため。
- FIFOは、プロセス間で呼び出しのバランスを取り、各プロセスの作業量を減らします。ありがとう!
java - 休止状態とオブジェクト プーリング
を含むクラスClassWithDates
(「C」と呼びましょう)がありますcollection of dates
。タイプ C のオブジェクトが多数あり、数千/数百万の日付オブジェクトがあり、それらはしばしば同時に参照されます。
日付オブジェクトのプールが必要で、要求された時間に存在する場合は、既に割り当てられているものを返します。これは非常に簡単ですが、Hibernate を使用する場合、その方法がわかりません。
「from ClassWithDates」クエリを実行し、遅延フェッチをオフにすると、Hibernates はクラス ClassWithDates のすべてのオブジェクトとすべての子コレクションをロードしますが、私の知る限り、コレクション内の各要素に対して新しい日付オブジェクトを作成します、オブジェクトが同じであっても。
不変クラスの Hibernate を使用したオブジェクト プーリングに興味があります。どうすれば実装できますか?
上記の例は、私が取り組んでいるコードを簡略化したものです。
java - ボードゲーム AI のオブジェクト プーリング
ボードゲームAIの作成を依頼されました(ゲームはチェッカーにかなり似ています)。これまでのところ、ビットボードを使用した NegaScout の基本的な実装を完了し、5 秒以内に 10 ハーフプライの深さに到達できます。ゲームのカテゴリはEXPTIME-completeにあります。言い換えれば、宇宙全体で原子よりも多くの動きがあります。NegaScout のおかげでこの数を減らすことができましたが、まだ多くの可能性のある動きに対処する必要があります。
私のボードはすでに do/undo 機能で静的です。しかし、新しいボード構成ごとに、許可されているすべての動きを生成する必要があり、クラスが次のように単純であっても、多くの時間がかかります。
そこで、質問が 2 つあります。
FIRST = オブジェクト プーリング (移動時) はパフォーマンスを向上させますか?
Second = if(FIRST) then 実装方法を教えてもらえますか? (リンクと小さなコード サンプルは本当にありがたいです!!)
javascript - 古典的ではなくプロトタイプの JavaScript でオブジェクト プーリングを実装するためのリソース
簡単な質問(少し面倒なビルドを含む)....
Douglas Crockford と Stoyan Stefanov は、JavaScript の本で、JavaScript プロジェクトを実装する際に古典的な (クラスベースの) パラダイムを避け、そのプロトタイプの設計を活用することを強く推奨しています。
型の安全性と最適化で失ったものは、柔軟性と保守性によって得られるはずなので、これは魅力的だと思います (私が理解しているように、それは最初のプロトタイプ言語である Self を作成する際の目標でした)。
ガベージ コレクターを制御するために、オブジェクト プーリング システムを作成する必要があります。これは、Web ベースの学習教材の「リアルタイム」シミュレーションを可能な限り作成しようとしているからです。
私が見つけることができる唯一のオープンな実装 (十分に文書化され、コメントされているように) は、gamecore.js ライブラリの一部であり 、このチュートリアル.
この実装は、class.js (古典的なエミュレート パターンを有効にするライブラリ) で動作します。私のプロジェクトでそれを使用するには、古典的なエミュレートの継承を使用する必要があります。
結局のところ、私の質問は単純です-実装の一部としてクラスエミュレーションを持たない、公開されているオブジェクトプーリングスクリプトを知っている人はいますか?
(これは時間を節約するためです。これを構築するのに 2 週間しかありません....)
前もって感謝します
ジェームズ
ゴールドスミス大学
java - シリアル化のためのバイト配列のプール
1 秒あたり 1000 など、多くのリクエストを処理するステートレス Web アプリケーションを想像してみてください。処理サイクル内で作成したすべてのデータは、最後にすぐに破棄されます。アプリはシリアライゼーション/デシリアライゼーションを頻繁に使用するため、リクエストごとに約 50 ~ 200kb を作成して破棄します。GC は大量の存続期間の短いオブジェクトを破棄する必要があるため、ガベージ コレクターに大きな負担がかかる可能性があると思います。バイト配列のプールを実装して、シリアライゼーション/デシリアライゼーションの目的でそれらを再利用することは理にかなっていますか? 誰もそのような経験をしたことがありますか?
java - JAXWS wsimport サービス オブジェクトをプールする - 可能ですか?
サード パーティの .Net Web サービスとのインターフェイスに JAXWS メトロ クライアントを使用しています。Web サービスで状態を維持する必要があります。というわけで、シナリオはこちら。.Net Web サービスを呼び出すメトロ クライアントを呼び出すユーザー アプリケーションがいくつかあります。
wsimport ツールを実行し、必要なクラスを生成しました。ただ、状態を維持しなければならないので、サービスクラスのオブジェクトプールを実装しようと考えています。このように、各ユーザー アプリは常に、それが使用している特定のサービス オブジェクトに関連付けられます。したがって、フローは次のようになります。
COSServiceImpl -> COSServiceFactory は、COSService (プールされる wsimport によって生成されたサービス クラス) -> .Net Web サービスをインスタンス化/維持します。
ということで、実装は以下の通り。誰にもより良い提案がありますか?考え?
UserApp.java
COSServiceImpl.java
COSServiceFactory.java
また、リクエストのタイムアウトを設定できる場所は他にありますか? このままでいいの?上記のコードでは、ポート オブジェクトを変更しているとは思いません。まだテストしていませんが、リクエストのタイムアウト プロパティは機能しますか?
コメントありがとうございます。
ビジェイ・ガナパシー
c++ - CまたはC++でのクローン可能なオブジェクトプールの実装はありますか?
これは奇妙に思えるかもしれませんが、私はそれを合理化しようとします。私は現在、 shared_ptrと組み合わせてboost.object_poolを広範囲に使用していますが、最近、本格的な再生/ロールバック/早送りなどの機能を作成するために、現在のプログラム状態のスナップショットを撮る必要がある状況に遭遇しました。
したがって、他の場所で使用するためにオブジェクトプールのクローンを作成しようとはしていません。これは、boost.poolのインターフェイス(私は許可されていません)によって許可されている場合でも、チャンクを指す有効なポインターがないため、明らかに機能しません。その新しく複製されたプールで、それは無意味でしょう。ただし、ここでの私の使用例は、再生/ロールバックが必要な場合に、元のプールに「貼り付け」たいというものです。
私は確かに、すべての状態、オブジェクト、サブ状態、サブオブジェクト、サブサブを手動でコピーして複製し、それらをスナップショットにパックして、すべてがうまくいくことを願っていますが、複雑さを考えるとエラーが発生しやすいですプロジェクトはすでに完了しており、メモリを直接コピーできる場合よりもはるかに遅くなる必要があります。コマンドパターン(または同様のもの)を使用して元に戻るを達成することも、元に戻るメカニズムが私の意図ではないため、かなり問題外です。
ダイハードの従来のCの方法を使用してプロジェクトを最初からやり直すかどうか疑問に思っていました。単純なmemcpy(snapshot、all_states、size)呼び出しで、ほとんどすべての作業を実行できます。
私がまだ欠けている他のオプションはありますか?基盤となるメモリ領域のクローンを作成できるboost.object_poolのような実装はありますか?状況を考慮すると、boost.object_poolを侵入的にハッキングすることはもっともらしいオプションですか?
c++ - 並行データ構造ではどのレベルのロック粒度が適切ですか?
私はマルチスレッドにまったく慣れていません。並列化の可能性がかなりあるシングルスレッドのデータ分析アプリを持っています。データセットは大きいですが、ハードディスクの読み取り/書き込みを飽和させることはありません。現在標準になっているスレッド化のサポートを利用して、高速化を図るべきです。
いくつかの調査の後、ディスクからデータを読み取って処理するにはプロデューサー コンシューマーが適切なアプローチであると判断し、プロデューサーがデータを置き、コンシューマーが取得する循環バッファーの一部となるオブジェクト プールの作成を開始しました。データ。クラスを書いているときに、データ メンバーのロックと解放の処理方法が細かすぎるように感じました。コードの半分がロックとロック解除を行っており、非常に多くの同期オブジェクトが浮かんでいるように感じます。
そこで、クラス宣言とサンプル関数を用意して、次の質問をします。これはきめが細かすぎますか? きめが細かすぎませんか?よく考えられていませんか?
いくつかの説明: 最初の PoolPtr は、ポインターと、ポインターの元のプール内のセグメント番号を格納するオブジェクトのような愚かな小さなポインターです。
第二に、これはすべて「テンプレート化」されていますが、コードブロックの長さを減らすためにそれらの行を取り出しました
3 番目の ReadWriteLock は、mutex と条件変数のペアを使用してまとめたものです。
python - メモリ制約下のオブジェクト プール
多数の大きなオブジェクトを使用します。理想的には、それらすべてをクライアント コードで永続的に利用できるようにしたいと考えていますが、一度にすべてを物理メモリに収めることはできません。そのため、メモリの制限に近づくと、プール内のオブジェクトの一部を破棄する必要があります (おそらく、使用頻度の最も低いオブジェクトを破棄します)。(ディスク上の仮想メモリを使用することは、システムが完全にフリーズすることと同じです。)
具体的には、オブジェクトあたりのメモリは ~100MB から ~10GB の間で変化します。私たちが持っている RAM の総量は 32GB です。
残念ながら、各オブジェクトが使用するメモリは、作成されるまでわかりません。したがって、特定のオブジェクトが利用可能な物理メモリに収まるかどうかを予測することはできません。
適切な解決策は、Python メモリ アロケータにコールバック関数を提供し、空き物理メモリの量が特定のしきい値を下回ったことを確認したときにメモリ アロケータがそれを呼び出すようにすることです。そのコールバック関数は、単にプールからオブジェクトを破棄して戻ります。一般に、メモリがすぐに利用可能になるという保証はありませんが、CPython (参照カウンターがゼロになった瞬間にメモリを解放する) では確実に利用可能になります。
残念ながら、メモリが少なくなったときに Python メモリ アロケータに提供された関数を呼び出させる方法を私は知りません。他にできることはありますか?
バックグラウンドで別のスレッドを実行し、使用可能なメモリを毎秒程度チェックすることができると思います。使用可能な物理メモリが 5GB 未満であると判断した場合、プールからオブジェクトを破棄し始めます。オブジェクトの破棄が平均して少なくともオブジェクトの作成と同じ速さで進行すると仮定すると、5GB のクッションはあまり使い果たされず、問題ありません。これはかなり壊れやすいようです。しかし、このアプローチの実装のアイデアはまだ素晴らしいでしょう。
これは Python 3.2 の下の Linux で動作する必要がありますが、Windows 用の (おそらく異なる) ソリューションがあればいいでしょう。
注:メモリ割り当ての 3 つの層が機能しています: OS、malloc
(C ランタイム)、および Python オブジェクト アロケータ。
android - Androidは、さまざまなタイプのエンティティに対してAndengineでオブジェクトプールを実装します
AndEngine for Android でゲームを開発しています。私のゲームでは、1 秒ごとにさまざまな種類のタイル (AnimatedSprite) を作成する必要があります。私はそれをしました。しかし、私は自分のゲームでぎくしゃくしたり遅れたりしています。オブジェクトの割り当てと割り当て解除が頻繁に行われるためだと思います。だから私は自分のゲームにオブジェクト プール パターンを実装したいと考えています。タイルを作成するための私の現在のコード:
AndEngine で ObjectPool を使用する例をいくつか見てきましたが、それらは単一のタイプのエンティティに対してのみ機能します。いくつかのタイプのエンティティを作成します。現在のシナリオを ObjecPool のものに変換する方法のガイドラインはありますか?
StaticTilePool クラス:
}