2017-11-23 15 views
0

私はC#言語でZeroMQを使用しています。それは次のエラーを投げている:OutOfMemoryException:zmq_msg_init_size(ProcessMemoryは4 GBまで増加し続けました)

OutOfMemoryException: zmq_msg_init_size 

は、以下のコードスニペットです:

private void onDataArrived(object sender, DataArrivedEventArgs e) 
{ 
    // receive the data in the form of bytearray 
    var message = new ZMessage{ new ZFrame(bytearray) }; 

    publisher.Send(message); 
} 

onDataArrivedは、コールバック関数です。

zmqContext = new ZContext(); 
publisher = new ZSocket(zmqContext, ZSocketType.PUB); 
publisher.Bind("tcp://*:9001"); // Using depth data port 

任意の提案を次のように出版社は、クラスのコンストラクタで定義されていますか?

私は、この破壊する必要がありますか?message

bytearrayを送信したいだけであることにご注意ください。私は最良の方法を知らないので、ZFrameZMessageオブジェクトを作成しました。

Visual Studioデバッガの内部で、プロセスメモリが増加し続けており、最大で4 GBになっていることがわかりました。この時点でエラーがスローされています。

+1

bytearrayをどのように宣言/初期化しましたか?それは空ですか? ZFrame(https://github.com/zeromq/clrzmq4/blob/master/ZFrame.cs)の実装を見ると、ZFrameの構築時に特定の状況下で上記例外がスローされます。 –

+0

@KerriBrown:基本的に、バイト配列は 'onDataArrived'コールバック関数の内部で作成されます。私は 'bytearray'の長さを調べました。約4,700,000バイトです。 –

+0

@mjwills:いいえ私はそうではありません。私はそれを知らない。上記のように 'zmqContext'と' publisher'を初期化しました。次に、私は 'publisher'を使ってコールバック関数のように' message'を送ります。私はちょうど 'bytearray'を送りたいと思います。私は最良の方法を知らないので、私は 'ZFrame'と' ZMessage'オブジェクトを作成しました。 –

答えて

2

を実装します。 一般的なの規則では、DisposeIDisposableオブジェクトを「終了」する必要があります。

DispoIntPtr(アンマネージメモリへのポインタ)が含まれているので、特にそれはZFrameで重要です。

Disposeコールがなければ、タイムリーに解放されません。 https://github.com/zeromq/clrzmq4/blob/master/ZFrame.cs

protected override void Dispose(bool disposing) 
{ 
    if (framePtr != null) 
    { 
     if (framePtr.Ptr != IntPtr.Zero) 
     { 
      Close(); // <- cleanup happening here 
     } 
    } 
    GC.SuppressFinalize(this); 
    base.Dispose(disposing); 
} 
+0

ありがとうございました。 –

関連する問題