2017-04-06 7 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 필드에 그들을 저장하는 것을 생각하고 있었다. 그러나 나는 거기의 모든 쉼표를 더하는 것이 공간의 낭비가 될 것 인 것을 안다.

이 시나리오에 대한 모범 사례가 있는지 궁금합니다.

기술적 자세한 내용은

: 나는 포스트 그레스를 사용할 필요가 데이터베이스에 대한

(나는이 분야에서 일종의 초보자의 생각), 그리고 프로그래밍 언어 (또한 초보자 :))

+0

하여 문자열 길이를 분할하고 저장하는 1 바이트로 2 개 헥사 문자를 팩 수 긴 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

'until'을 사용하는'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하고 쉽게 읽을 수있는 장점을 제공합니다 : 빠르고 합리적으로 공간 효율적인 솔루션에 대한

, 당신은 단순히 16 진수 문자열을 쓸 수 y 프로그램.

또한 "0,0,6" 문자열에 0이 나오더라도 작동합니다. 당신이 요소의 짝수 번호가있는 경우

, 당신은 하나의로 무엇 (0 <값 <16)을 코딩에 대해 2

+0

간단하고 읽기 쉽기 때문에이 솔루션이 마음에 듭니다. 데이터를 확인하여 알 수 있다는 것이 중요합니다. –

+1

또한 색인을 생성 할 수있는 이점이 있습니다. 다섯 번째 값을 얻으려면 (물론 0부터 세어)'str [5] .to_i (16)'을 실행하십시오. –