2012-06-16 2 views
10

Java에서 길이 32의 부울 값 (부울 [])을 (> 10'000) 배열에 저장하고 나중에 계산 및 비교를 위해 다시 읽으려고합니다.Java : 효율적으로 boolean [32]를 저장 하시겠습니까?

단일 배열의 길이가 32이므로 32 비트 시스템에서 읽기 및 쓰기 속도를 높이려면 정수 값으로 저장하는 것이 좋을지 궁금합니다. BitSet을 사용하고 int로 변환 하시겠습니까? 또는 int와 바이트를 잊어 버리시겠습니까?

+1

효율적인 스토리지 또는 효율적인 (즉, 빠른) 읽기/쓰기가 무엇보다 중요합니까? –

+0

나는이 응용 프로그램에서 빠른 읽기/쓰기가 훨씬 더 중요하다고 생각합니다. – navige

+1

모든 배열을 한번 쓰고 읽고 싶습니까? 아니면 특정 배열에 무작위로 액세스해야합니까? – Behe

답변

11

이진 저장의 경우 intDataOutputStream (읽기에는 DataInputStream)을 사용하십시오.

부울 배열은 Java에서 내부적으로 바이트 또는 int 배열로 저장되므로 오버 헤드를 피하고 항상 인코딩을 유지하는 것이 좋습니다. 즉, 부울 []을 사용하지 않는 것이 좋습니다.

대신

public class BooleanArray32 { 
    private int values; 

    public boolean get(int pos) { 
    return (values & (1 << pos)) != 0; 
    } 

    public void set(int pos, boolean value) { 
    int mask = 1 << pos; 
    values = (values & ~mask) | (value ? mask : 0); 
    } 

    public void write(DataOutputStream dos) throws IOException { 
    dos.writeInt(values); 
    } 

    public void read(DataInputStream dis) throws IOException { 
    values = dis.readInt(); 
    } 

    public int compare(BooleanArray32 b2) { 
    return countBits(b2.values & values); 
    } 

    // From http://graphics.stanford.edu/~seander/bithacks.html 
    // Disclaimer: I did not fully double check whether this works for Java's signed ints 
    public static int countBits(int v) { 
    v = v - ((v >>> 1) & 0x55555555);     // reuse input as temporary 
    v = (v & 0x33333333) + ((v >>> 2) & 0x33333333);  // temp 
    return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24; 
    } 
} 
+0

+1, 지금, 이것은 OP의 필수품을위한 BitSet보다 확실히 좋습니다. –

+0

완전히 이해가됩니다! 고마워요! – navige

+0

set에서 오류를 수정하고 정적 도우미를 맨 아래로 이동했습니다. bitsInNibble 도우미의 비트 수를 두 번 확인하고 싶을 것입니다. 모든 것이 작업에 예상대로 작동하면 알려주십시오 :) –

1

같은 것을 가지고 내가 어떤 압축 당신이 당신의 논리 값 것이다 증가 읽기 팩 및 시간을 쓸 수 있도록려고하고 강한 인상입니다. (내 실수로, 분명히 약물을 놓치고있었습니다). 당신은 관련된 스토리지 측면에서 오히려 얻을 것입니다.

BitSet은 비즈니스 로직 측면에서 현명한 선택입니다. 내부적으로 int를 변환 할 수있는 long 값을 저장합니다. 그러나, BitSet은 당신에게 그것의 비밀 정보를 보여줄만큼 충분하지 못하기 때문에 각 비트 인덱스를 순서대로 얻어야합니다. 즉, 바이트를 직접 사용하는 것보다 int로 변환하는 것이 실제적인 이점이 없다는 것을 의미합니다.

불필요한 오버 헤드가 발생하지 않으므로 Stefan Haustein (BitSet을 모방하는 데 필요한만큼 확장 됨) 솔루션이 저장소 요구 사항에 적합합니다.

+0

첫 번째 문장은 사실이 아닙니다. 저장소는 바이트 단위 또는 더 큰 단위로 구성되며, 여러 메모리 액세스 및 간단한 계산보다 훨씬 느린 순서. –

+0

조직 및 메모리 액세스 비율에 대해서는 정확하지만 캐시도 고려해야합니다. 나는 그것을 설명하기 위해 내 대답을 고칠 것이다. –

+1

여기에 캐시가 어떻게 관련되어 있는지 알지 못합니다. 이것은 실제로 압축에 관한 것이 아니라 단지 하나의 비트를 바이트가 아닌 단일 비트로서 저장하는 것에 관한 것입니다. –

관련 문제