gpt4 book ai didi

c# - MySQL BLOB 图像数据逐渐丢失?

转载 作者:可可西里 更新时间:2023-11-01 06:59:00 25 4
gpt4 key购买 nike

在 mysql MyISAM 表中,我有一个列类型 mediumblob 并将捕获的图像存储为 blob 数据。我得到了一些有趣但有问题的图像。一些图像逐渐丢失数据。

Field          type  
--------------------------
image mediumblob

my.ini 最大允许数据包大小设置 max_allowed_pa​​cket = 8M

image1 image2 image3

这就是问题所在

C# 应用程序从服务器获取数据时,这种图像每次都会丢失随机大小的数据。我在 100000+ 图像数据中得到了 10-12 这样的坏图像。

这种行为的原因可能是什么?任何人都知道如何解决/避免此问题。

更新 1:
从 PictureBox 中读取字节

MemoryStream ms = new MemoryStream();
byte[] ret = null;

try
{
picturebox.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] Data = new byte[ms.Length];
ms.Read(Data, 0, (int)ms.Length);
ret = byteData;
ms.Close();
}

将字节数组作为中等 blob 数据保存到数据库中。从数据库中检索数据时,我正在转换阅读器数据:

byte[] Data = (byte[])reader["Image"];

最佳答案

首先,正如 Sarke 提到的,将文件内容存储在数据库中并不是最好的主意(文件元数据是一个完全不同的故事。

为什么?

  1. 性能:在大多数情况下,操作系统文件缓存的性能优于 DBMS 中内置的任何内容。
  2. 灾难恢复:发生故障时丢失所有/大部分文件的几率比文件系统高得多,恢复也困难得多
  3. 扩展:如果您的容量超出了单个服务器的容量,添加应用程序级别的分片是微不足道的,并且不会影响性能。多服务器数据库设置更“痛苦”
  4. 提供多种解决方案/易于迁移:有大量用于大型文件集合存储的硬件和软件解决方案,在它们之间迁移比在 DBMS 之间迁移要简单得多

我存储了将近 200 万张图像,这些图像存储在一个简单的文件夹结构中:/xx/yy/filename,其中文件名 = 文件的 md5(+ 可选数字,如果发生哈希冲突), xx = md5 的前 2 个字符,yy = md5 的第 3 个和第 4 个字符。它工作得很好,我应该不会在很长一段时间内遇到任何与 FS 相关的减速(至少 2 个数量级)。

回到你的问题,有 3 个选项

  1. 文件永远不会正确保存到数据库中。上传照片的应用可能有问题,或者图片太大。您的 max_allowed_pa​​cket 将图像大小限制为 ~8 MB,mediub_blob 最多可存储 16 MB。要排除此问题,请将 max_allowed_pa​​cket 增加到 32 MB 并进行测试。您需要确保在任何时候都没有图像超过此大小,并确保应用程序在上传照片时能够正常工作。如果您能找到上传并显示良好的图像(来自数据库!),但后来却找不到,那么这不是原因。
  2. 文件在更新过程中损坏 - 如果有任何内容以任何方式更新照片,那么即使原始文件没问题,更新后的文件也可能不正常 - 例如,它可能超过第 1 点的大小限制。
  3. (最不可能的一个)如果文件在没有损坏的情况下被存储和更新,那么它在存储时会被损坏 -> 没有关于此的 MySQL 错误报告(这不会被忽视)我会看服务器硬件。

关于c# - MySQL BLOB 图像数据逐渐丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11009408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com