2010-06-29 4 views
2

쉬운 것이어야합니다.모노크롬 비트 맵

저는 긴 시퀀스의 바이너리 데이터를 처리하기 위해 스칼라에서 일하고 있습니다. 그것은 0과 1의 긴 목록입니다. 이러한 종류의 데이터를 저장/액세스하는 '가장 좋은'방법은 무엇입니까?

여기서 중요한 점은 메모리 최적화이므로 전체 바이트를 사용하여 부울을 저장하지 않는 것이 좋습니다. 또한 액세스가 somwhat 중요하므로 바이트로 누른 다음 배열로 그들을 paking 피하고 싶습니다.

BitMap은 좋은 생각입니까? 그런 수업이 스칼라에 있습니까?

그렇지 않다면 ByteArray를 사용하는 것이 가장 좋습니까? 어떻게 구현할 것인가?

다른 아이디어?

감사합니다,

답변

2

(영리 explicits이 더 스칼라 같이 할 경우 아마도 부부와 함께) 당신은 java.util.BitSet의를 사용할 수 있습니다.

여전히 너무 비싸다면 배열을 내부적으로 사용하는 클래스를 작성하고 비트를 int 또는 바이트로 패킹하십시오.

+0

좋아요! 스칼라가 BitSet을 가지고있는 것을 발견했습니다 (http://www.scala-lang.org/docu/files/api/scala/collection/BitSet.html). 유일한 문제는 크기가 너무 작을 수 있다는 것입니다 (Int로 표시). 고마워, – Skuge

2

값이 균등하게 분산되어 있지 않으면 (0보다 훨씬 더 많음) run-length encoding을 사용하여 이미지 데이터를 인코딩 할 수 있습니다. 팩스에서 사용하는 인코딩입니다.

두 가지 인코딩 옵션은 다음과 같습니다 흑백

  • 에서만 사용 RLE에 대한

    • 사용 RLE 한 색상은 당신이 다른 색상 (또는 혼합 섹션)
    를 인코딩하는 경우 직접 인코딩을 사용
  • +0

    좋은 생각이지만이 정보를 저장할 수있는 데이터 구조를 찾고 있습니다. 런 길이 인코딩을 사용하는 경우 Int의 목록을 사용 하시겠습니까? 정수가 32 비트이기 때문에 좋은 압축을 얻으려면 매우 특별한 배포본이 필요해 보인다. (예를 들어, 종이는 큰 공백의 좋은 예이다.) – Skuge

    +0

    Byte를 가져 가면 Int는 아마 낭비 될 것이다. 검정 또는 흰색 색상의 경우 1 비트를 절약하는 2^7 길이입니다. –