2017-04-06 32 views
0

我有一個很長的小數字列表,其中所有的列表都是< 16,但是在一個唯一的列表中可能有超過10000個。如何存儲Postgres中的小數字列表

我得到的值作爲一個逗號分隔的列表,如:

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的(和我的排序初學者在這一領域),以及編程語言是紅寶石(也是初學者:))

+0

劃分字符串長度約編碼它們(0 <值<16)什麼,並將其作爲單長VARCHAR()中的字節?你也可以「分組」值來修復更多的單個字符。當然,你在太空中存儲的東西,你將花費複雜性/時間來提取。 (我沒有看到答案,也許是相同或相似的mudasobwa答案) – etsa

+0

「高效」。它應該快速還是儘量少用空間? –

回答

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" 
+0

用'直到'你的'tap'方法是一個很好的接觸。我不知道它是否會發生,但是你的方法忽略了前面的'0'值。編輯:我的意思是領先! –

+0

沒有多餘的線索零:) – mudasobwa

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" 

它帶來的是由任何DB和易於閱讀的優點y程序。

此外,即使在字符串中有前導0 s也適用:"0,0,6"

如果有偶數個元素的,可以包2六個字符轉換成一個字節,除以2

+0

我喜歡這個解決方案,因爲它簡單易讀。能夠通過查看來判斷您的數據是否正常非常重要。 –

+1

它也有你可以索引它的優點。要獲得第五個值(當然從零開始計數),執行'str [5] .to_i(16)'。 –

相關問題