我有一长串小数字,所有这些都是< 16但是在一个唯一的列表中可以有超过10000个。
我将值作为逗号分隔列表获取,例如:
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 :(得分:2)
对于快速且合理节省空间的解决方案,您只需编写一个十六进制字符串:
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"
它带来的优点是任何数据库和任何程序都可以轻松读取。
此外,即使字符串中有前导0
,它仍然有效:"0,0,6"
。
如果您有偶数个元素,则可以将2个hexa字符打包成一个字节,将字符串长度除以2。
答案 1 :(得分:1)
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"