在啥时候将大量结构化数据存储为 BLOB 才有意义?

     2023-03-22     136

关键词:

【中文标题】在啥时候将大量结构化数据存储为 BLOB 才有意义?【英文标题】:At which point does storing a large amount of structured data as BLOB make sense?在什么时候将大量结构化数据存储为 BLOB 才有意义? 【发布时间】:2021-12-27 00:45:52 【问题描述】:

我们正在运行一个用于数据分析的数据库支持的 Web 应用程序,目前基于 C#.NET,服务器上带有 EntityFramework,客户端主要是 HTML+Javascript 框架(基于 Web)。

我们的应用程序会定期接收由用户上传或由其他基础设施接收的大量批量测量 X/Y 数据点,即 1e6 或更多。

目前我们在 MSSQL 中有一个名为 Valuesid, series_id as int; x, y, z as float 的表。该表是BULK INSERT,客户端上传时填充了数据,相关元数据保存在Series 表中。 db 总大小目前接近 1TB,其中 99.99% 为Values 数据。

这种方法实现起来很简单,但它有几个缺点,随着时间的推移,它变得复杂且缓慢:

我们必须以块的形式插入,以免对它进行预处理的 IIS 进程过载(目前每个块有 200'000 个数据点) 在 INSERT 期间 IIS 进程内存需求巨大(>1500MB 用于 200MB 数据) 插入速度太慢(500 万条记录相当于 100MB,即使使用 BULK INSERT 也需要 >30 秒才能插入) 在 INSERT 期间,整个表被锁定,即一次只能插入一个用户 检索数据也很慢,请求 1e6 条记录有时需要 >10 秒 删除具有 >1e6 条记录的系列经常会导致 Web 应用端超时。

数据永远不会被部分选择,所以我们真的不需要将它放在一个表中。但它在发送给客户端之前被“精简”显示,即 1e6 条记录 - 默认情况下,即在 99% 的用例中 - 在发送给客户端之前减少到 2000 或 10'000 条记录。这被缓存在客户端上,但如果新客户端请求相同的集合,则会再次对其进行处理。 Values 表在series_id 上也有一个索引,它比表本身占用更多的磁盘空间。

我想知道将这种存储格式更改为具有自己的数据格式(CSV 或 JSON 或二进制)的“值”中的 BLOB 存储是否有意义,并且 - 也许 - 具有预处理“缩减”数据集的附加列可以在不改变的情况下推送到客户端的显示(例如,在 JSON 中)。所以新的Values 表格格式类似于

id, series_id, data(blob), reduced_data(blob)

每个Series 条目只有一个Value,而不是1e6 或更多。收到上传的数据时会创建一次缩减的数据集,然后在客户端请求时用于显示

我将丢失通过 ID 或 X/Y 值选择的 values 的部分选择,但绝不会根据 idseries_id 以外的任何内容选择值,因此这是当前不是局限性。所以这是我的问题:

这有意义吗?我希望创建和删除大型 BLOB 数据集总是比创建和删除 1,000,000 条记录要快得多。是吗? 二进制 BLOB 还是 CSV/JSON/.. BLOB? BLOB 存储的最简单方法当然是创建一个巨大的 CSV 或 JSON 块并将其保存(可能是压缩的)在数据库中。自定义二进制数据格式会更小,但必须先转换为 JSON,然后才能发送给客户端。

我觉得二进制数据格式带来的额外麻烦可能不值得,而且最好是压缩 CSV/JSON blob,而不是发明二进制格式。是吗?

我什至可能不知道的 BLOB 的其他缺点如何?大小限制似乎不是问题,varbinary(MAX) 就足够了。我不需要对 blob inside 的值的索引,只需在元数据(在 Series 表中)上。

想法?

【问题讨论】:

旁白:你不应该将你的表命名为Values,因为这是一个保留关键字(source 是的。或者User,或者... :-) 实际上,我没有。但是 a) 我很懒, b) 真实的表名会泄露有关我们应用程序的信息,这可能是超级机密的公司机密信息,你知道的。 【参考方案1】:

在 DB 中存储文件的主要优势之一是 DB 中的ACID(原子性、一致性、隔离性、持久性)技术。这使我们能够在处理数据时安全地将所有数据插入到不同的表中。当您将文件作为 BLOB 存储在 DB 中时,您在将文件复制到其他存储时具有优势,因为 BLOB 比操作文件系统更快,并且您可以轻松备份文件。但是,如果每条记录的文件大小超过 10-50-100 MB,则不建议将文件存储在 BLOB 中。在这种情况下,向表中插入记录的持续时间可能需要 10-15-30 秒。不是很好,因为事务也持续这么久,而且事务过程中的所有表在这个意义上都被阻塞了,而这些表的长时间阻塞也会导致用户无法工作。 将文件存储为 BLOB 的有趣方式之一是 FILESTREAM BLOB 技术,该技术仅受 SQL Server 支持。您可以从this

获取有关此技术的更多信息

【讨论】:

感谢您的指点。我将多个 50MB 数据块的 INSERT 基准测试到我们生产服务器上的示例表中,每个需要 1-2 秒,这是可以接受的。但是 FILESTREAM BLOB 也是一个好主意。

什么时候使用没有 typedef 的结构有意义?

】什么时候使用没有typedef的结构有意义?【英文标题】:Whendoesitmakesensetouseastructwithoutatypedef?【发布时间】:2021-09-0901:04:00【问题描述】:C中的结构声明了一个数据结构,它将不同的数据类型关联到一块连续的内存中。Typedef是... 查看详情

将存储库模式与文档数据库一起使用是不是有意义?

】将存储库模式与文档数据库一起使用是不是有意义?【英文标题】:Doesitmakesensetousetherepositorypatternwithadocumentdatabase?将存储库模式与文档数据库一起使用是否有意义?【发布时间】:2011-11-2119:33:19【问题描述】:我目前正在试... 查看详情

c++ 指针参数:创建指向值的副本是不是有意义,然后再次将副本存储为指针?

...参数:创建指向值的副本是不是有意义,然后再次将副本存储为指针?【英文标题】:c++pointerarguments:doesitmakesensetocreateacopyofthevaluepointedtoo,thenstorethecopyaspointeragain?c++指针参数:创建指向值的副本是否有意义,然后再次将副本存... 查看详情

将 Spark 用于具有关系非分片数据存储(例如 MySQL)的描述性分析是不是有意义?

】将Spark用于具有关系非分片数据存储(例如MySQL)的描述性分析是不是有意义?【英文标题】:DoesitmakessensetouseSparkfordescriptiveanalyticswitharelationalnon-shardeddatastore(e.g.MySQL)?将Spark用于具有关系非分片数据存储(例如MySQL)的描述性... 查看详情

在 Azure Blob 存储中为大量数据设置 Blob 索引标记的最佳方法是啥

】在AzureBlob存储中为大量数据设置Blob索引标记的最佳方法是啥【英文标题】:WhatistheoptimalwayofsettingBlobindextaginAzureBlobstorageforlargeamountofdata在AzureBlob存储中为大量数据设置Blob索引标记的最佳方法是什么【发布时间】:2022-01-0222:05:... 查看详情

稀疏数组简单使用(代码片段)

...们不必要将这些没有值的位置都存储到磁盘中,那么这个时候为了解决类似这种问题,稀疏数组诞生了! 先来给刚才的二维数组画一个图:假设这我们需要保存到磁盘的那个二维数组,用Java代码表示为:int[][]=newint[11][11];我... 查看详情

如果 HBase 不在分布式环境中运行,它是不是有意义?

...一个数据索引,这将需要以(document,term,weight)的形式存储大量三元组。我将存储多达几百万个这样的行。目前我在 查看详情

当用户群沉迷于电子表格时,啥 UI 设计才有意义

...述】:在我正在开发的软件的第一次迭代中,我们编写了大量的js来模拟类似Excel电子表格的体验。现在用户对他们必须做的滚动量不满意。他们最喜欢的UI是 查看详情

如何将状态保存为 db 中的代码,但将它们映射到 rails 中有意义的单词?

...描述】:我需要一些帮助,请...如果我将事务状态保存为数据库中的代码,但我想将它们转换为有意义的名称,我该怎么做?这还推荐吗?如果没有,有什么替代方案?例如:在数据库中, 查看详情

将 NSString 对象设置为零有意义吗?

】将NSString对象设置为零有意义吗?【英文标题】:DoesitmakesensetosetNSStringobjectstonil?【发布时间】:2012-09-0519:56:51【问题描述】:在viewDidUnload中,我将IBOutlets设置为nil,我还将NSString对象设置为nil。这些是(nonatomic,strong)。将NSString... 查看详情

如何按照基于 ml 的分类顺序将十六进制字符串转换为有意义的数据?

...按照基于ml的分类顺序将十六进制字符串转换为有意义的数据?【英文标题】:Howtoconverthexstringstoameaningfuldatainorderofmlbasedclassification?【发布时间】:2021-10-0113:14:15【问题描述】:我有一些代表tcp数据包有效负载的十六进制字符串... 查看详情

使用 OR-Mapper 有意义吗?

...理如下:1.)SQL属于哪里?a.)在我参与的每个专业项目中,数据的安全性一直是一项关键要求。存储过程为控制访问和审计 查看详情

java示例代码_将字符串拆分为有意义的标记

java示例代码_将字符串拆分为有意义的标记 查看详情

如何将文本行转换为有意义的单词[重复]

】如何将文本行转换为有意义的单词[重复]【英文标题】:Howtoconvertlineoftextintomeaningfulwords[duplicate]【发布时间】:2018-02-1319:05:48【问题描述】:我有一行字符串:"specificationsinaccordancewithqualityaccreditedstandards"需要拆分成分词如:"s... 查看详情

我使用多进程将数据插入 MySQL 是不是有意义?

】我使用多进程将数据插入MySQL是不是有意义?【英文标题】:DoesitmakeanysensethatIusemultiprocessestoinsertdatatoMySQL?我使用多进程将数据插入MySQL是否有意义?【发布时间】:2013-07-2403:18:34【问题描述】:我需要向MySQL中插入大约3亿条... 查看详情

java存取blob数据(代码片段)

...的对象数组,如上传一组图片、添加一道题目等等,这个时候在数据库中存储一般需要用到存储长度较大的blob类型,在java的实体类中对应blob类型的是byte数组。思路为了存储的数据格式兼容性更高,我采用的是借助json的方式来... 查看详情

hbase和hive的差别是啥,各自适用在啥场景中

...身不存储数据,它完全依赖HDFS和MapReduce。这样就可以将结构化的数据文件映射为为一张数据库表,并提供完整的SQL查询功能,并将SQL语句最终转换为MapReduce任务进行运行。而HBase表是物理表,适合存放非结构化的数据。2.Hive是基... 查看详情

[19/05/07-星期二]jdbc(javadatabaseconnectivity)_clob(存储大量的文本数据)与blob(存储大量的二进制数据)(代码片段)

一、CLOB(CharacterLargeObject)–用于存储大量的文本数据–大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。•Mysql中相关类型:–TINYTEX... 查看详情