問題タブ [circular-buffer]

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.

0 投票する
1 に答える
993 参照

c - c の 1 つのコンシューマー複数のプロデューサーは、バッファーがいっぱいになった後に再開するときに競合を防ぎます

複数のクライアントが異なる長さのメッセージをバッファに書き込む循環バッファを作成しました。サーバーはそれらを読み取ります。それはコードを消費者/生産者の問題に基づいていました。問題は、バッファがいっぱいになり、サーバーがバッファからすべてのデータを削除すると、クライアントは書き込み操作を再開するように通知されますが、代わりに別のクライアント (別のスレッド内) がバッファにメッセージを書き始めることです。メッセージが順不同で到着しないように、バッファーがいっぱいになる前に既に書き込みを行っていたクライアントが操作を再開するようにします。

これは私のコードです(多くのテストコードを削除しました)

0 投票する
2 に答える
2163 参照

vb.net - 高速循環バッファ

高速データ取得に使用するアプリケーションのメモリ効率を改善するように依頼されました。VSメモリプロファイラーを数回実行し、明らかな問題がないかプロジェクトをスキャンした後、次の結論に達しました。取得したサンプルポイントを格納するために固定サイズの循環バッファーを使用しているにもかかわらず、RAM使用量はポーリング期間に比べて増加します。例:2マイクロ秒で1つの信号のデータをポーリングすると、バッファサイズが同じであっても、50マイクロ秒で実行する場合の5倍のメモリ(プライベートバイト)を使用できます。

循環バッファは、SamplePointオブジェクトの配列です。これらの各オブジェクトには、信号ごとの対応するデータ用のShorts(16ビット)の配列と、タイムスタンプ用の1つの日付オブジェクト(8バイト)が含まれています。効率を上げるために、循環バッファは、ポーリングを開始するたびに1回だけ再調整され、空のサンプルポイントで満たされ、その後「割り当て」られます。

また、アプリケーションを停止して実行すると、Redimが前のアレイを解放していないかのように、毎回さらに多くのメモリを消費しているようです。

私の質問は次のように要約されます。

配列を持つ管理対象オブジェクトを含む循環バッファを実装するための最もメモリ効率の高い方法は何ですか?また、ポーリング速度が異なる固定サイズのアレイを使用すると、メモリ使用量がどのように、そしてなぜ増加するのでしょうか。ガベージコレクターには時間がありませんか?サブ変数または関数が終了すると、ローカル変数はすぐに破棄されますか?

これらは、先に進む前に除外したい疑問と懸念の一部です。お時間を割いていただきありがとうございます。また、コードを投稿することもできますが、たくさんあり、散らばっているので意味がありません。

編集:これは、循環バッファの初期化、ポピュレーション、およびリセットを反映する、私が作成した要約コードです。バグがありますか?

0 投票する
0 に答える
177 参照

c++ - C++ のリングのようなデータ構造

重複の可能性:
C++ 用の循環リストの標準実装はありますか?

アクセスが「リングのように」動作するデータ構造を探しているので、イテレータをインクリメントして最後に到達すると、最初にリセットされます。データを追加すると、サイズが大きくなるはずです。

boost::circular_buffer挿入はリングのように振る舞うので、私が探しているものではないと思います。私のリストは無限に成長できるようにする必要があります。

これには一種の標準的な方法がありますか?回避策を簡単に見つけることができますが、このようなものが存在するかどうか興味があります。最後が常に最初の要素などに接続されているリンクされたリスト。

アップデート

示唆されているように、私は同様の質問を調べましたが、そのs3riusようなもののために独自のイテレータを作成する方法の例があります。私はこれを試して、クローズに投票しました。

0 投票する
8 に答える
22325 参照

java - Java のスレッドセーフ循環バッファ

並行して実行されているいくつかの Web サーバー インスタンスを考えてみましょう。各サーバーは、単一の共有「ステータス キーパー」への参照を保持します。その役割はN、すべてのサーバーからの最後の要求を保持することです。

例 ( N=3):

いつでも、「ステータス キーパー」はN、SLA レポートに対するこれらの最後の要求を読み取る監視アプリケーションから呼び出される可能性があります。

Java でこの生産者と消費者のシナリオを実装し、Web サーバーに SLA レポートよりも高い優先度を与える最良の方法は何ですか?

CircularFifoBufferは、要求を保持するのに適切なデータ構造のようですが、効率的な同時実行を実装する最適な方法が何であるかはわかりません。

0 投票する
2 に答える
538 参照

c# - Silverlightの循環キュー機能

私はSilverlight3.0でアプリケーションを作成しています。そのアプリケーションでは、次のような機能を実装したいと考えています。値のコレクションを維持する必要があります。そのコレクションの一方の端から値を継続的に追加し、もう一方の端から値を削除しています。つまり、3000個の値のコレクションを維持したいとします。そのコレクションに1つの値を追加する場合は、1つの値を削除して、3000個の値のコレクションのみを取得する必要があります。「循環キュー」を使用したいので、循環キューのSilverlightに機能はありますか?または、循環キューの代わりに効率的なロジックはありますか?助けてください。よろしくお願いします。

0 投票する
1 に答える
3150 参照

c - 文字列をバッファに挿入する方法は?

私はCプログラミングに不慣れです。文字列をテキストファイルに書き込む循環バッファを作成したいと思います。

問題は、文字列を循環バッファに挿入し、その後テキストファイルに書き込む方法です。この実装は数値でのみ機能します。

0 投票する
2 に答える
6660 参照

c++ - C++でロックフリー循環バッファを使用してゼロコピーTCPを実装する方法

TCPストリームからのデータを消費する必要がある複数のスレッドがあります。TCPソケットから読み取るために、共有メモリ内の循環バッファ/キューを使用したいと思います。TCP受信は、循環キューに直接書き込みます。コンシューマーはキューから読み取ります。

この設計では、ゼロコピーとゼロロックを有効にする必要があります。ただし、ここには2つの異なる問題があります。

  1. TCPソケットから1つの論理メッセージだけを読み取ることは可能/効率的ですか?そうでない場合で、複数のメッセージを読んだ場合は、残差をこれからthis->nextにコピーする必要があります。

  2. ロックレスキューを実装することは本当に可能ですか?不可分操作があることは知っていますが、これらもコストがかかる可能性があります。すべてのCPUキャッシュを無効にする必要があるためです。これは、24コアすべてのすべての操作に影響します。

低レベルのTCPで少し錆びており、メッセージがいつ完了したかを正確に判断する方法がわかりません。\ 0を探しますか、それとも実装固有ですか?

ty

0 投票する
0 に答える
101 参照

android - 循環リスト ビューを作成する方法、または循環ビューに値を入力する方法

重複の可能性:
閉じた (円形の) ListView を作成するには?

私はアンドロイドにかなり慣れていないので、循環形式でリストビューを作成したいと思います.これを行うか、何らかの循環レイアウトを作成する方法はありますか? 通常のリスト ビューが垂直方向に値を入力する場合、循環形式で値を入力するリスト ビューが必要です

0 投票する
3 に答える
930 参照

clojure - Clojure の循環データ構造には、ref のような構成要素が含まれている必要がありますか?

今日、結び目と循環データ構造を結ぶことへの言及を見てきました。私はいくつかの回答を読んでいますが、解決策には、参照を使用してリストの先頭を指すことが含まれているようです。1 つの特定のSO の質問で Haskell の例が示されましたが、その例が ref に相当する Haskell を使用しているかどうかを知るのに十分なほど Haskell を知りません。

ref または同様の構造を使用せずに Clojure データ構造を循環させる方法はありますか?

ありがとう。

0 投票する
3 に答える
640 参照

c++ - 計測器キャプチャ データの処理

データのストリームを生成する機器があります。私のコードは callback を介してこのデータにアクセスしますonDataAcquisitionEvent(const InstrumentOutput &data)。データ処理アルゴリズムは、データの到着速度よりも大幅に遅くなる可能性があるため、すべてのデータを処理することは期待できませんが (そうする必要はありません)、できるだけ多くのデータを処理したいと考えています。私が制御できないデータ取得速度を備えた環境センサーとしての機器に感謝します。InstrumentOutputたとえば、異なる場所での 3 つの同時圧力測定値を含むクラスである可能性があります。

また、データの簡単な履歴を保持する必要があります。たとえば、データのサンプルを 200 ミリ秒ごとに処理することが合理的に期待できると仮定します。ほとんどの場合、最後のサンプルを 1 つだけ処理しても問題ありませんが、最後のサンプルに異常な読み取り値が存在するかどうかに応じて、その最新のサンプルの前に到着した数秒分のデータを確認する必要がある場合があります。

onDataAcquisitionEvent()もう 1 つの要件は、センサーでのデータ損失を回避するために、できるだけ早くコールバックから抜け出すことです。

データ取得ライブラリ (サードパーティ) は、別のスレッドで機器データを収集します。

次のデザインを考えました。単一のプロデューサー/単一のコンシューマー キューを持ち、データ トークンを onDataAcquisitionEvent() コールバックの同期キューにプッシュします。
受信側では、キューからデータをポップするループがあります。データ到着率が高いため、ループはほとんどスリープしません。各反復で、次のことが起こります。

  1. 利用可能なすべてのデータをキューからポップし、
  2. ポップされたデータは循環バッファーにコピーされます (ブースト循環バッファーを使用しました)。このようにして、履歴が常に利用可能になります。
  3. バッファ内の最後の要素を処理します (そして、前の要素を調べる可能性があります)。
  4. ループを繰り返します。

質問:

  1. この設計は適切ですか? また、落とし穴は何ですか? と
  2. より良いデザインは何でしょうか?

編集:私が考えた1つの問題は、循環バッファのサイズが必要な履歴を保持するのに十分な大きさではない場合です。現在、単純に循環バッファーを再割り当てして、そのサイズを 2 倍にしています。1回か2回だけでいいと思います。