none
ファイル書き込みによるメモリ消費量の増加について RRS feed

  • 質問

  • 現在、下記のように1秒間に1ファイルを作成するプログラムを調べています。

    このプログラムを実行すると右肩上がりにWindowsのメモリを消費してしまうのですが、原因がわかりません。

    原因や修正方法が分かる方、ご教授いただけないでしょうか?

    <現象>

    ・実行していると、どんどんWindowsのメモリを消費してしまう(パフォーマンスモニタのCommitted Bytesのログを出すことで確認)

    ・1時間に20MB程度の増加

    ・タスクマネージャにて、アプリケーションプロセスのメモリ消費量を確認したが、そちらはほとんど変化していない

    ・ファイルを作成するフォルダのインデックス作成オプションを外して試してみたが結果は変わらなかった

    <環境>  

    VisualStudio2005 Professional Edition

     

    <プログラム>

    Imports System.IO

    Public Class Form1

        ' ******************
        ' 1秒に1回呼ばれる
        ' ******************
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim fileName As String = makeFileName()

            writeFile(fileName)
            writeMemLog("")
        End Sub


        ' ******************************************************
        ' システムで使用されているメモリ量をログに出力する
        ' ******************************************************
        Public Sub writeMemLog(ByVal msg As String)
            Dim buf As String
            Dim ccc As New System.Diagnostics.PerformanceCounter("Memory", "Committed Bytes")

            buf = Now().ToString("yyyy/MM/dd HH:mm:ss") & "," & msg & "," & ccc.NextValue().ToString("0000000000")

            Dim fileName As String = "c:\test\" & Now().ToString("dd") & "mem.log"
            Dim sw As New System.IO.StreamWriter(fileName, True, System.Text.Encoding.Default)
            sw.WriteLine(buf)
            sw.Close()
        End Sub


        ' ******************************************************************************************************
        ' ファイル名の作成
        ' 現在時刻を元に、"c:\test\2006\12\22\10\20061222102345.csv" のようなファイル名を作っているだけ
        ' ******************************************************************************************************
        Public Shared Function makeFileName() As String
            Dim buf As String
            Dim d As Date = Now()

            buf = d.Year().ToString("0000") & "\" & d.Month().ToString("00") & "\" & d.Day().ToString("00")
            buf = buf & "\" & d.Hour().ToString("00") & "\"
            buf = buf & d.Year().ToString("0000") & d.Month().ToString("00") & d.Day().ToString("00")
            buf = buf & d.Hour().ToString("00") & d.Minute().ToString("00") & d.Second().ToString("00")
            buf = buf & ".csv"

            Return System.IO.Path.Combine("C:\test", buf)
        End Function


        ' **********************
        ' ファイルの作成
        ' **********************
        Public Sub writeFile(ByVal fileName As String)
            Dim sw As StreamWriter = Nothing

            Try
                Dim path As String = System.IO.Path.GetDirectoryName(fileName)
                If System.IO.Directory.Exists(path) = False Then
                    ' フォルダが存在しない場合
                    System.IO.Directory.CreateDirectory(path)
                End If

                sw = New StreamWriter(fileName, False, System.Text.Encoding.Default)

                sw.WriteLine("#")

            Finally
                If IsNothing(sw) = False Then
                    sw.Close()
                End If
            End Try
        End Sub
    End Class

     

     

    2006年12月22日 4:06