【问题标题】:How to store a list of small numbers in Postgres如何在 Postgres 中存储小数列表
【发布时间】:2017-09-01 13:46:08
【问题描述】:

我有一长串小数字,它们都

我以逗号分隔列表的形式获取值,例如:

6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2, .... lots and lots of numbers

最后,我需要以最有效的方式将值存储在数据库中,以便被读回并再次处理......作为字符串,逗号分隔值。

我正在考虑将它们存储在一个大的 TEXT 字段中......但是我发现在其中添加所有逗号会浪费空间。

我想知道这种情况是否有任何最佳做法。

更多技术细节:

对于数据库,我必须使用 Postgres(我是这个领域的初学者),编程语言是 Ruby(也是初学者:))

【问题讨论】:

  • 如何对它们进行编码 (0
  • “高效”。它应该快速还是使用尽可能少的空间?

标签: ruby postgresql list numbers storage


【解决方案1】:

对于快速且合理节省空间的解决方案,您可以简单地编写一个十六进制字符串:

string = '6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2'

p string.split(',').map { |v| v.to_i.to_s(16) }.join
# "6ca2226c8226a24cea2"
p '6ca2226c8226a24cea2'.each_char.map { |c| c.to_i(16) }.join(',')
# "6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2"

它带来了易于被任何数据库和任何程序读取的优势。

此外,即使字符串中有前导 0s,它也可以工作:"0,0,6"

如果你有偶数个元素,你可以将 2 个十六进制字符打包成一个字节,将字符串长度除以 2。

【讨论】:

  • 我喜欢这个解决方案,因为它简单易读。能够通过查看来判断您的数据是否正常很重要。
  • 它还有一个优势,你可以索引它。要获得第五个值(当然是从零开始计数),请执行 str[5].to_i(16)
【解决方案2】:
numbers = "6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2"

numbers.split(',')
       .map { |n| n.to_i.to_s(2).rjust(4, '0') }
       .join
       .to_i(2)
       .to_s(36)
#⇒ "57ymwcgbl1umt2a"

"57ymwcgbl1umt2a".to_i(36)
                 .to_s(2)
                 .tap { |e| e.prepend('0') until (e.length % 4).zero? }
                 .scan(/.{4}/)
                 .map { |e| e.to_i(2).to_s }
                 .join(',')
#⇒ "6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2"

【讨论】:

  • 你的tap 方法与until 是一个很好的接触。我不知道它是否会发生,但您的方法忽略了领先的 0 值。编辑:我的意思是领导!
  • 没有多余的尾迹零:)
猜你喜欢
  • 2019-05-12
  • 2012-05-06
  • 2020-04-04
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多