如果您有一个小数据集(数百 MB),则将 SQL DBMS 与任何替代方案一起使用都没有问题。
正如 Maciej 所提议的,序列化是对其他替代方案的改进,例如您可以将每个频谱扫描分组为单个元组(表格中的行),从而减少键和其他信息的开销。
对于序列化,您可以考虑使用线串或多点等对象,以便能够使用 SQL 函数更好地处理数据。这将需要一些扩展,但允许查询数据,如果您使用 WKB,您还可以在存储使用方面获得相关收益,而性能损失很小。
问题是频谱数据容易累积,存储使用可能成为序列化技巧无法轻易解决的问题。您应该在您的项目中仔细考虑这一点。
在处理类似问题时,我得出的结论是,使用任何 SQL DMBS(MySQL、SQL Server、Postgre 等)来管理大型数值矩阵数据(例如频谱扫描测量)都是一个坏主意。这有点像试图通过将图像逐像素存储到数据库中来创建图像库 CMS。
下表对我实验中的几种格式进行了比较。这可能有助于理解使用 SQL DBMS 存储数值数据矩阵的问题。
MySQL 表具有键 - Int(10) - 和值 - 十进制(4,1) 1 157 627 904 B 的表
TXT CSV 十进制(4,1),相当于14bit 276 895 606 B
BIN(原始)矩阵 1 字节 x 51200 列 x 773 行 + 元数据 40 038 580 B
HDF5 矩阵 3 字节 x 51200 列 x 773 行 + 元数据 35 192 973 B
TXT + Zip CSV 十进制 (4,1) + 标准 zip 压缩 34 175 971 B
PNGRGBa 矩阵 4 字节 x 51200 列 x 773 行 33 997 095 B
ZIP(BIN) 使用标准 zip 26 028 780 B 压缩的原始 BIN 文件
PNG 8bIndexed 矩阵 1 字节 x 51200 列 x 773 行 + 色标 25 947 324 B
使用 MySQL 的示例没有使用任何序列化。我没有尝试过,但人们可能期望通过使用 WKT 线串或类似功能将占用的存储空间减少到几乎一半。即便如此,使用的存储空间几乎是相应 CSV 的两倍,是具有相同数据的 PNG8b 大小的 20 多倍。
当您停下来想一想您在使用 SQL DBMS 时在键和搜索优化方面存储了多少额外数据时,这些数字是意料之中的。
作为结束语,我建议您考虑使用 PNG、TIFF、HDF5 或任何其他更适合构建前端来存储频谱数据(或任何其他大型矩阵)的数字格式,以及可能使用 SQL DBMS 来处理围绕此核心数据的维度,例如谁测量、何时测量、使用哪种设备、达到哪个目的等。简而言之,在数据库内部或外部有一个 BLOB 文件,因为它更适合您的系统架构。
或者,值得考虑使用围绕某些数字格式(例如 HDF5)的大数据解决方案。每个工具都到了尽头。