0

ソケット アプリケーション (最大 5k の同時接続を処理する) で受信したバイトのコレクション型が必要です。

a を使用してみましたList<byte>が、内部配列が 1 つあり、大量のデータを受け取るため、OutOfMemoryExceptions が発生する可能性があります。

だから私はコレクションが必要です、

  • データを小さなブロックに保持します。Unrolled Linked Listのように。
  • IList<T>各受信操作の後にメッセージの終わりを示す区切り文字を探すため、高速検索 (できれば ) を提供します。

私が今使っているのは ですStreamMemoryStreamあまり多くのデータを含まない操作には を提供し、大量FileStreamのデータを含む操作には一時ファイルを提供します。

MemoryStreamList<T>ただし、ファイルをバッファとして使用しないことを好みます。

それで...
どのようなコレクションまたはアプローチをお勧めしますか?

4

2 に答える 2

0

ネットワーク アプリケーションに不適切なアーキテクチャを使用しているようです。必要なデータのみをバッファする必要があります。ここでは、リストを使用して、必要な量のデータが受信されるまでデータをバッファリングしています。

データ自体のデータを受信するたびに区切り記号を確認することをお勧めします。区切り記号がある場合は、区切り記号に遭遇するまでデータのみをプッシュする必要があります。データの準備ができたら、リストから取得して使用し、リストから破棄する必要があります。すべてをリストに追加するのは良い方法ではなく、確実に多くのメモリを消費します。

理想的には、実際にデータを受信する前に、受信するデータの長さを常に通知するプロトコルを用意する必要があります。このようにして、必要なデータが受信されたことを確認でき、区切り文字に依存する必要はありません。

于 2013-01-10T13:55:46.910 に答える
0

可能な迅速で汚い解決策:

プログラムの開始時に、受信する最大量のデータに十分な大きさのバッファーを割り当てます。別の「カウント」フィールドを使用して、現在使用中のデータ量を追跡します。

(私はこの解決策があまり好きではありません。ファイルを使用するか、ブロック内のデータを操作する方法を見つけますが、うまくいくかもしれません)。

于 2013-01-10T14:34:26.200 に答える