我有一个 C++ 应用程序,每秒生成 6 个相对较小的类似图像的整数数组。数据是64x48x2维int(即64x48二维向量的网格,每个向量由两个 float 组成)。每张图像大约为 26kb。该应用程序还生成时间戳和一些描述数据的功能。我想将每帧的时间戳和特征存储在 MySQL 数据库列中。我还需要将原始数组存储为二进制数据,可以存储在光盘上的文件中,也可以存储为数据库中的 blob 字段。假设应用程序将或多或少地不间断运行,并且我将想出一种方法来归档超过特定年龄的数据,这样存储就不会成为问题。
对于 blob、光盘上的文件或我可能没有想到的其他方法,这里有哪些权衡?我不需要查询二进制数据,但我需要查询表中的其他元数据/功能(我肯定会根据时间戳构建索引),并检索二进制数据。如果我将多个帧存储在磁盘上的单个文件中(而不是每个文件一帧),方程会发生变化吗?
是的,我已阅读 MySQL Binary Storage using BLOB VS OS File System: large files, large quantities, large problems和 To Do or Not to Do: Store Images in a Database ,但我认为我的问题有所不同,因为在这种情况下,将有数百万个相同尺寸的二进制文件。我不确定在文件系统中维护这么多小文件与在 db blob 列中存储这么多文件相比,对性能的影响如何。任何观点将不胜感激。
最佳答案
在某个时刻,查询许多 blob 会变得慢得难以忍受。我怀疑即使您的二进制文件尺寸相同,情况也会如此。此外,您仍然需要一些代码来访问和处理 blob。而且这并没有利用文件缓存,而文件缓存可能会加速直接从文件系统的图像查询。
但是!您提供的链接没有提到基于对象的数据库,它可以以一种您可以非常快速地访问它的方式存储您所描述的数据,并且可能以 native 格式返回它。有关讨论,请参阅链接或仅搜索谷歌,有很多讨论:
Storing images in NoSQL stores
我也会研究 HBase。
我想既然您一开始就不确定要使用什么(并且没有答案),那么替代解决方案可能是合适的。
关于MySQL Blob 与磁盘( "video frames"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160859/