2012-02-17 4 views
2
나는 dB의 압축 문자열로 해시를 저장할

, 나는 팩 부분을 아래로 확인을 얻을 수 있지만, 나는 내가 생각Perl에서 해시를 압축하여 원래 상태로 되 돌리는 방법은 무엇입니까?

테스트 해시

my $hash = { 

    test_string => 'apples,bananas,oranges', 
    test_subhash => { like => 'apples' }, 
    test_subarray => [ red, yellow, orange ] 

} 

다시 해시를 받고 문제가 있어요 어쩌면 나는 this example과 같은 JSON : XS를 사용하여 해시 문자열을 json 문자열로 변환 한 다음 JSON 문자열을 포장 할 수 있습니다.

이 접근 방식에 대한 생각은?

답변

4

Storable가 매우 정밀 펄 구조를 저장할 수있는 검색시 freeze

  • 밖으로 thaw을의 문자열로 당신의 해시 (REF) . 약한 참조 등을 기억해야하는 경우 저장 가능해야합니다. 그렇지 않으면, 나는 그것을 피할 것입니다.

    JSON (JSON::XS) 및 YAML이 좋습니다.

    • 한 버전의 Storable을 사용하여 저장하고 이전 버전을 사용하여 검색하려고하면 문제가 발생할 수 있습니다. 즉, 데이터베이스에 액세스하는 모든 머신은 동일한 버전의 Storable을 가져야합니다.
    • JSON :: XS가 Storable보다 빠릅니다.
    • 빠른 YAML 모듈은 아마도 Storable보다 빠릅니다.
    • JSON은 개체를 저장할 수 없지만 YAML 및 Storable은 저장할 수 있습니다.
    • JSON 및 YAML은 사람이 읽을 수 있습니다 (일부 사람의 경우).
    • JSON 및 YAML은 다른 언어로도 구문 분석하고 생성하기 쉽습니다.

    사용법 :

    my $for_the_db = encode_json($hash); 
    my $hash = decode_json($from_the_db); 
    

    나도 몰라 무엇을 "포장"에 의해 당신이 남자. JSON :: XS에 의해 생성 된 문자열 encode_json은 그대로 저장할 수 있습니다. 나는 BLOB을 추천합니다.

  • +0

    +1 : "일부 인간에게"! – Zaid

    4

    Storable 모듈에 소용돌이를 부여 할 수 있습니다.

    그것은 할 수 있습니다

    • 저장
    +0

    'freeze'는 UTF-8 문자가 포함 된 내용을 정지해도 문자가 아닌 바이트를 반환합니다. – cjm

    +0

    @cjm : 지적 해 주셔서 고맙습니다 ... 나는 설명서를 잘못 읽었습니다. – Zaid

    3

    데이터 구조를 스칼라에 저장 한 다음 다시 원래 상태로 "복원"하는 데는 여러 가지 방법이 있습니다. 장점과 단점이 각각 있습니다.

    JSON을 시작한 이래로이 예제를 사용하여 보여줄 수 있습니다.

    use JSON; 
    my $hash = { 
    
        test_string => 'apples,bananas,oranges', 
        test_subhash => { like => 'apples' }, 
        test_subarray => [ red, yellow, orange ] 
    
    } 
    
    my $stored = encode_json($hash); 
    
    my $restored = decode_json($stored); 
    

    이미 제안 된 바와 같이 저장 가능 또한 좋은 생각입니다. 그러나 다소 황당 할 수 있습니다. 자신 만의 스크립트/시스템이 데이터를 저장하고 복원하기를 원한다면 좋겠지 만 그 이상의 경우에는 엉덩이에 고통이 될 수 있습니다. 서로 다른 운영 체제에서 데이터를 전송하더라도 문제가 발생할 수 있습니다. Freeze를 사용하는 것이 좋았고, 대부분의 로컬 응용 프로그램에 대해서는 적절한 호출이었습니다.여러 기계에서 데이터를 전송하기 위해 Storable을 사용하려면 nfreeze를 사용하십시오.

    즉, 데이터 구조를 "저장"할 수있는 많은 인코딩 방법이 있습니다. YAML 또는 XML을보십시오.

    1

    "해시를 JSON 문자열로 변환 한 다음 JSON 문자열을 포장하는 것"이 ​​무슨 뜻인지 잘 모르겠습니다. 추가 "포장"이 필요한 것은 무엇입니까? 아니면 "저장"하셨습니까?

    데이터베이스에 해시를 저장하는 여러 가지 대체 방법이 있습니다.

    Zaid가 제안 했으므로 해시는 Storable ~ freezethaw 해시를 사용할 수 있습니다. 이것은 가장 빠른 방법 일 수 있습니다 (속도가 중요한 경우 사용중인 데이터로 벤치 마크해야하지만). 하지만 Storable은 사람이 읽을 수없는 이진 형식을 사용합니다. 즉, Perl을 사용하여이 필드에 액세스 할 수 있음을 의미합니다.

    제안한대로 해시를 JSON 문자열로 저장할 수 있습니다. JSON은 사람이 읽을 수있는 장점이 있으며 대부분의 언어에 JSON 라이브러리가 있으므로 Perl 이외의 데이터베이스 필드에 쉽게 액세스 할 수 있습니다.

    CouchDB 또는 MongoDB과 같은 문서 지향 데이터베이스로 전환 할 수도 있지만 훨씬 더 큰 단계입니다.

    +1

    저장이 가장 빠르지 않습니다. 다른 사람들이 모르는 많은 정보를 저장하고 있으며 시간이 오래 걸립니다. – ikegami

    관련 문제