ZipOutputStream MemoryLeak - PullRequest
       11

ZipOutputStream MemoryLeak

0 голосов
/ 01 декабря 2011

Я использую ZipOutputStream, чтобы получить файлы из базы данных, сжать в zip и загрузить (zip файл около 400mb). Во время этого объем памяти пула приложений увеличивается до 1.4gb, а после завершения загрузки он уменьшается до 1gb, когда он должен вернуться к значению 100 mb или к чему-либо. Есть только около 10 пользователей, использующих это приложение и только 1 пользователь, использующий эту конкретную страницу. я вызываю метод утилизации. Я также попытался явно вызвать GC.Collect, но все равно бесполезно. Я что-то здесь упускаю?

Заранее спасибо.

  Dim zipStream = New ZipOutputStream(HttpContext.Current.Response.OutputStream)
    Try


        da.Fill(ds)
        For Each dr As DataRow In ds.Tables(0).Rows
            Try
                Dim docName As String = ""
                strImgID = dr("image_id")
                If Not IsDBNull(dr("loan_number")) Then iLoanID = dr("loan_number")

                If Not IsDBNull(dr("document_name")) Then docName = dr("document_name")
                Dim ext As String = dr("image_type_extension")
                Dim strFinalFileName As String = ""

                strFinalFileName = docName & "_" & iLoanID & ext

                Dim b As Byte() = dr("image_binary")
                Dim fileEntry = New ZipEntry(Path.GetFileName(strFinalFileName))
                zipStream.PutNextEntry(fileEntry)
                zipStream.Write(b, 0, b.Length)
            Catch ex As Exception
                LogError(ex, iLoanID & "," & strImgID)
                AddError(sb, ex, iLoanID & "," & strImgID)
            End Try
        Next

     Catch ex As Exception
        Throw
    Finally

        zipStream.Close()
        zipStream.Dispose()
          cmd.Connection.Close()
        cmd.Connection.Dispose()
    End Try

1 Ответ

2 голосов
/ 01 декабря 2011

Вам нужно разбивать данные на потоки, а не выделять их все сразу.

Например (на языке c #)

byte[] buffer = new byte[4096];

FileStream readFs = File.OpenRead(strFile);

for (int rnt = readFs.Read(buffer, 0, buffer.Length); 
      rnt > 0; 
      rnt = readFs.Read(buffer,  0, buffer.Length))
{
      zipoutputstream.Write(buffer, 0, rnt);
}

Думаю, это поможет решить проблему с памятью.Пожалуйста, оставьте комментарий, если нет ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...