我有一个大型的邮件数据库,需要将其发送到其他系统。邮件的平均大小为5-10mb,但有些则更大(50-70mb)。我需要对每个消息进行base64编码到磁盘。我的应用程序正在消耗大量内存,将消息编码到磁盘上,我无法弄清楚原因。
我尝试过的事情:我读了多篇有关dispose
方法的文章。我已经尽可能多地实现了dispose
函数(通过using
)来释放资源,但是我仍然发现控制台应用程序的内存使用率很高(700mb +)。
为简单起见,我从数据库中选择了10个最大的文件,大小在55-75mb之间。通常情况下,应用程序将处理消息24/7。
这是执行以下代码时我的内存使用情况。扁线表示处理大文件的结束。为什么这些资源没有被释放?
这是我的堆视图的捕获:
这是我的代码:
const string sql = "SELECT TOP 10 * FROM [dbo].[OutboundMessages] ORDER BY [Length] DESC";
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(sql, connection))
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
{
if (reader.HasRows)
{
while (reader.Read())
{
using (MemoryStream stream = new MemoryStream())
{
int ordinal = reader.GetOrdinal("FileData");
long bytesRead, offset = 0;
byte[] buffer = new byte[4096];
while ((bytesRead = reader.GetBytes(ordinal, offset, buffer, 0, buffer.Length)) > 0)
{
offset += bytesRead;
stream.Write(buffer, 0, (int)bytesRead);
}
string file = Guid.NewGuid().ToString().Replace("-", string.Empty);
using (StreamWriter writer = new StreamWriter(file))
{
writer.Write(Convert.ToBase64String(stream.ToArray()));
}
}
}
}
}
}
答案 0 :(得分:1)
我通过将字节直接以3个字节的倍数(3 * 1024 = 3072)写入文件来解决了这个问题。现在我的进程内存保持在稳定的20mb。一次写入3个字节(或多个字节)可确保base64不会丢失二进制格式的文本格式。
df