【问题标题】:Mdf file growing too large inserting binary dataMdf文件过大插入二进制数据
【发布时间】:2014-09-24 19:58:18
【问题描述】:

我正在使用 jpeg 并将它们作为 varbinary(MAX) 数据类型字段中的字节数组插入到表中。但是,mdf 文件的大小是我要插入的所有文件的总大小的三到四倍。我正在使用标准的 c# 编码技术来获取网络响应并将其转换为内存流:

byte[] result;
byte[] buffer = new byte[4096];

using (Stream responseStream = request.GetResponse().GetResponseStream())
{
    using (MemoryStream memoryStream = new MemoryStream())
    {
        int count = 0;
        do
        {
            count = responseStream.Read(buffer, 0, buffer.Length);
            memoryStream.Write(buffer, 0, count);

        } while (count != 0);

        result = memoryStream.ToArray();

    }
}

然而不知何故,512mb 的 jpeg 最终使 mdf 的大小超过了 2gb。在我插入表格的地方,我也在使用 result.length 定义该字段的长度。自动增长设置为 5%。

【问题讨论】:

  • 这就是为什么文件应该像文件一样存储在文件系统中,即使是jpges。

标签: c# sql-server memorystream varbinary responsestream


【解决方案1】:

一个 512 MB 的 jpeg 在数据库中应该只占用 512 mb 多一点。 mdf 本身可能会变大,但这取决于数据库配置的增长增量。 sp_spaceused 应该显示已用空间与可用空间。

但是使用内存流处理文件的方式实际上很糟糕。永远不会工作。阅读Download and Upload images from SQL Server via ASP.Net MVC 了解将文件从 HTTP 流式传输到数据库的正确方法。您必须使用UPDATE blob.write,因为应用程序进程内存大小限制以及数据库最小记录操作要求。链接的文章更详细地解释了为什么以及如何做到这一点。您也可以使用相同的技术在 Web 响应中进行流式传输,而无需在内存中创建完整副本。

【讨论】:

  • 可能我没说清楚,不是1个文件,而是几十万个。我正在通过 webrequest 下载它们,然后将它们插入数据库,但正如我所说的 mdf 变得太大,我不明白为什么。
  • 每个文件平均有多大?
  • 大约 25k。不知何故,他们得到了“填充”
  • 没有填充可以占4:1的比例。您可以运行sp_spaceusedsp_spaceused <yourtable> 并将结果发布到您的OP 中吗?
  • 不幸的是,我只是在吹走一堆记录后缩小了它,现在正在重新加载它。需要几个小时!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 2010-11-10
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多