来自数据库的.NET Core高内存使用率base64编码消息

时间:2019-05-27 01:22:06

标签: c# memory-management

我有一个大型的邮件数据库,需要将其发送到其他系统。邮件的平均大小为5-10mb,但有些则更大(50-70mb)。我需要对每个消息进行base64编码到磁盘。我的应用程序正在消耗大量内存,将消息编码到磁盘上,我无法弄清楚原因。

我尝试过的事情:我读了多篇有关dispose方法的文章。我已经尽可能多地实现了dispose函数(通过using)来释放资源,但是我仍然发现控制台应用程序的内存使用率很高(700mb +)。

为简单起见,我从数据库中选择了10个最大的文件,大小在55-75mb之间。通常情况下,应用程序将处理消息24/7。

这是执行以下代码时我的内存使用情况。扁线表示处理大文件的结束。为什么这些资源没有被释放?

live memory usage

这是我的堆视图的捕获:

object heap view

这是我的代码:

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()));
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我通过将字节直接以3个字节的倍数(3 * 1024 = 3072)写入文件来解决了这个问题。现在我的进程内存保持在稳定的20mb。一次写入3个字节(或多个字节)可确保base64不会丢失二进制格式的文本格式。

df