【问题标题】:Efficient way to Store Huge Number of Large Arrays of Integers in Database在数据库中存储大量整数数组的有效方法
【发布时间】:2014-02-18 02:55:42
【问题描述】:

我需要针对整数 ID 和字符串名称存储一个长度约为 1000 的整数数组。这种元组的数量几乎是160000。

我将选择一个数组并计算所有其他数组的均方根偏差 (RMSD),并将 (ID1,ID2,RMSD) 元组存储在另一个表中。

您能建议最好的方法吗?我目前正在将 MySQL 用于同一项目中的其他数据表,但如有必要,我会切换。

【问题讨论】:

  • RMSD 计算是在数据库中完成还是通过外部脚本完成?如果它会在外部发生,并且这是该数组的唯一用途,我想知道将其存储为二进制 blob 是否可行?
  • @LindsayWinkler ,我需要它用于 Web 服务,用户将使用字符串名称请求,我将计算具有请求名称的数组的 RMSD 到所有其他数组,并回复 10-50 个名称最小 RMSD。一旦存储的名称数组值很少更新,新的数组会偶尔添加。
  • 会在 SQL 中使用一些内置或用户定义的函数来完成计算吗?或者当时是否会有一些外部逻辑计算 RMSD 值?如果要将数组提取到其他代码中并在那里完成计算,您可以只存储数据库不必理解或操作的二进制数据?
  • @LindsayWinkler,感谢您的建议。我只计算2个数组的RMSD,即sum=0;对于 i=0 到 n-1 总和+=(arr1(i)-arr2(i))^2; RMSD=sqrt(总和);我认为如果这是在 sql 中完成的,计算可能会更快,或者我可能只是检索数组并在服务器脚本中计算 RMSD。再次感谢您的建议。我会试试这个。如果有任何更好的方法可以做到这一点,请指导我。我正在为我的生物信息学研究项目开发一个工具,因此将来可能需要更复杂的计算。因此,在服务器脚本中进行计算可能比在 sql 中更好。

标签: mysql database bigdata


【解决方案1】:

一种可能性是将数组存储在BINARYBLOB 类型列中。鉴于数组的基本类型是整数,您可以一次遍历四个字节以提取每个索引处的值。

如果我正确理解上下文,则数组必须具有相同的固定长度,因此BINARY 类型的列将是最有效的,如果它提供足够的空间来容纳您的数组。您不必担心这里的数据库规范化,因为您的数组在这种情况下是一个原子单元(再次假设我正确理解了这个问题)。

如果您确实需要仅访问每个数组的一部分,那么这可能不是最实用的数据存储方式。

次要考虑是是在数据库本身中计算 RMSD 值,还是在服务器上以某种外部语言计算。正如您在 cmets 中提到的,这将在数据库中最有效。不过,听起来查询无论如何都会相当昂贵,而且执行时间可能不是主要问题:用另一种语言编码的简单性可能更可取。还取决于计算 RMSD 值的成本相对于将查询往返于数据库的成本,它甚至可能没有那么大的区别?

或者,正如您在问题中提到的那样,使用 Postgres 可能值得考虑,因为它更具表现力的 PL/pgSQL 语言。

顺便说一句,如果您想四处搜索有关好的方法的更多信息,搜索databasetime series 可能会很有成效。您的数据不一定是时间序列数据,但许多相同的考虑因素都适用。

【讨论】:

  • 谢谢。这个建议对我来说似乎很有吸引力。我会试一试,然后和你讨论性能。
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 2011-04-10
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多