我使用ZipOutputStream
从db获取文件,压缩到zip并下载(400mb
左右的zip文件)。
在此期间,我的应用程序池内存最高为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
答案 0 :(得分:2)
您需要将数据块化到流中,而不是一次性分配所有数据。
E.g。 (在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);
}
我认为这有助于解决你的记忆问题。如果不是,请回复。