0

Linux システムでアクティブ化されている多くのスレッドを持つシステムがあります。各スレッドは特定のサイズのバッファーを割り当て、このバッファーがいっぱいになるとファイルに書き込みます。各スレッドには独自のバッファーがあり、そのバッファーを別のファイルに書き込みます。バッファ サイズを比較的大きく (1M サイズ以上) に設定すると、メモリ リークが発生し始めることがわかりました。ただし、バッファーが小さい場合 (約 1K 以下)、これらのメモリ リークは発生しません。

何が原因か分かる人いますか?そしてもっと重要なのは、どうすればこの問題を克服できるでしょうか? 小さいバッファーを使用すると、システムのパフォーマンスに大きな影響を与える可能性があります。

バッファへの書き込み - else if(m_bUseBuffer) { //データ バッファがいっぱいになりました if (m_nBufferSize+pi_nDataLength >= cMaxSizeQLoaderFileBuffer) { hRes = WriteDataToFile(); }

        if (SUCCEEDED(hRes)) 
        {
            if (m_nBufferSize+pi_nDataLength <= cMaxSizeQLoaderFileBuffer) 
            {
                memcpy(m_sBuffer+m_nBufferSize,pi_pData,pi_nDataLength);

                m_nBufferSize += pi_nDataLength;

                m_nBufferLinesCounter++;

                //need to write buffer to file otherwise next time we write the file will be too large.
                if (m_nBufferLinesCounter + m_nQLoaderFileLinesCounter >= m_nQLoaderFileMaxLines) 
                {
                    hRes = WriteDataToFile();
                }
            }

バッファをファイルに書き込んでいます-

            hRes = OpenFile();

    if (SUCCEEDED(hRes))
    {
        m_fQLoaderFile.write(m_sBuffer,m_nBufferSize);
        m_fQLoaderFile.flush();

        m_nBufferSize = 0;
        m_nQLoaderFileLinesCounter += m_nBufferLinesCounter;
        m_nBufferLinesCounter = 0;
    }

type- std::ofstream からの場合

4

3 に答える 3

0

スレッド (またはそのバッファ) をRAIIラッパーでラップすることは可能でしょうか? つまり、コンストラクタで発生するバッファのヒープ割り当てとデストラクタで発生する割り当て解除を使用して、(偶発的なヒープ割り当てを防ぐため) オーバーロードされたプライベート new 演算子を使用してラッパー オブジェクトをスタックに割り当てますか?

あるいは、固定長 (スタックが割り当てられた) バッファはおそらく問題に適していますか?

于 2012-10-22T09:47:17.037 に答える
0

詳細がなければ、この質問に答えることはほぼ不可能です。@karolyが示唆したように、コードが正しければ、バッファサイズは問題になりません。

バッファ サイズが重要な場合に考えられることの 1 つは、バッファ サイズが大きすぎると一部の割り当てが失敗する可能性があるということです。次に、これが発生すると、そのような状況 (例外をキャッチしないか、エラー状態をテストしない) では、コードがうまくクリーンアップされない可能性があります。

于 2012-10-22T09:57:41.993 に答える
0

あなたの質問はあまりにも漠然としているため、一般的な回答しかできません。コードをvalgrindでチェックすると、すべてのメモリ リークが報告されます。

ところで、コードが正しければ、バッファ サイズは問題になりません。

于 2012-10-22T09:46:40.333 に答える