0

TCPソケットを使用して、PCから電話にそれぞれ約10 Mbsのファイルを送信しています。電話側では、次のようなデータを受信して​​います。

  Dim B As Byte() = New Byte(Socket.ReceiveBufferSize - 1) {}
  Me.Args.SetBuffer(B, 0, Socket.ReceiveBufferSize)
  Me.Socket.ReceiveAsync(Me.Args)

ReceiveBufferSize プロパティは 30000000 に設定されています。これが私の読み方です。

 Dim R As Byte() = New Byte(Me.Args.BytesTransferred - 1) {}
 Dim s As New MemoryStream(Me.Args.Buffer)
 Me.Args.SetBuffer(0, 0)

 s.Read(R, 0, ntpData.Length)
 s.Dispose()

このプロセスには大量のメモリ (約 300Mbs) が必要なため、メモリ使用量の上限が 180Mbs の低価格デバイスではアプリを実行できません。.Dispose()OjbectDisposed 例外がスローされるため、電話が何かを受信するたびにソケットを使用することはできません。どうすればメモリを解放できますか?

4

3 に答える 3

1

質問がひっくり返る可能性があるようです。どうすれば少ないメモリを使用できますか? たとえば、次のことができます。

  • ソケットから小さなチャンクでデータをダウンロードし、同じバッファを再割り当てするのではなく再利用します。
  • メモリではなく分離ストレージ ストリームにデータを書き込み、特定の時点でアプリに表示する必要があるものだけを memroy に読み込みます。

(これは、作業している正確なシナリオに依存します)

また、割り当て済みのメモリが参照を保持していないことを確認して、使用が終了したら、ガベージ コレクションが行われていることを確認する必要があります。

また、アプリのプロファイリングを行って、問題の原因が本当にこのソケット メモリであること、または実際には別の場所にある他のメモリが原因であることを確認しましたか?

于 2013-05-02T10:22:07.963 に答える
0

問題の実際の解決策が見つからなかったため、回避策を使用してなんとか解決しました。

データのすべてのパケットはヘッダーでマークされます。大量のデータを送信する前に、別のヘッダーを持つパケットをクライアントに送信します。次に、クライアントはその種類のヘッダーを認識し、ヘッダーの次のバイトを読み取ります。これらには、次に来るストリームの長さが含まれています。したがって、クライアントはバッファの長さを設定し、データが来るのを待ちます。

于 2013-05-05T10:08:38.583 に答える
0

開発段階でメモリ不足になったので、あなたはとても幸運です。

Windows Phone で 84KB を超えるバッファ (バイト配列) サイズを使用しないでください。GC は 84KB を超えるバイト配列のデータを収集しません。

コードは次のようになります。

Try
            stream.Position = 0
            Dim totalRead As Long = 0
            Dim readBuffer As Integer
            Dim bufferSize As Long = 4096 'under 86KB
            Dim readArray = New Byte(bufferSize - 1) {}
            While totalRead < stream.Length
                readBuffer = Await stream.ReadAsync(readArray, 0, bufferSize)
                totalRead += readBuffer
                'Use readArray here
            End While
            stream.Dispose()
        Catch ex As Exception
            'Log My exception
        Finally
            stream.Dispose()
        End Try

これに似たコードを変更してみてください。50MB RAM を超えることはありません。

幸運を。

于 2013-05-03T11:52:07.967 に答える