Java에서 길이 32의 부울 값 (부울 [])을 (> 10'000) 배열에 저장하고 나중에 계산 및 비교를 위해 다시 읽으려고합니다.Java : 효율적으로 boolean [32]를 저장 하시겠습니까?
단일 배열의 길이가 32이므로 32 비트 시스템에서 읽기 및 쓰기 속도를 높이려면 정수 값으로 저장하는 것이 좋을지 궁금합니다. BitSet을 사용하고 int로 변환 하시겠습니까? 또는 int와 바이트를 잊어 버리시겠습니까?
Java에서 길이 32의 부울 값 (부울 [])을 (> 10'000) 배열에 저장하고 나중에 계산 및 비교를 위해 다시 읽으려고합니다.Java : 효율적으로 boolean [32]를 저장 하시겠습니까?
단일 배열의 길이가 32이므로 32 비트 시스템에서 읽기 및 쓰기 속도를 높이려면 정수 값으로 저장하는 것이 좋을지 궁금합니다. BitSet을 사용하고 int로 변환 하시겠습니까? 또는 int와 바이트를 잊어 버리시겠습니까?
이진 저장의 경우 int
및 DataOutputStream
(읽기에는 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;
}
}
+1, 지금, 이것은 OP의 필수품을위한 BitSet보다 확실히 좋습니다. –
완전히 이해가됩니다! 고마워요! – navige
set에서 오류를 수정하고 정적 도우미를 맨 아래로 이동했습니다. bitsInNibble 도우미의 비트 수를 두 번 확인하고 싶을 것입니다. 모든 것이 작업에 예상대로 작동하면 알려주십시오 :) –
같은 것을 가지고 내가 어떤 압축 당신이 당신의 논리 값 것이다
증가 읽기 팩 및 시간을 쓸 수 있도록려고하고 강한 인상입니다.
(내 실수로, 분명히 약물을 놓치고있었습니다). 당신은 관련된 스토리지 측면에서 오히려 얻을 것입니다.
BitSet은 비즈니스 로직 측면에서 현명한 선택입니다. 내부적으로 int를 변환 할 수있는 long 값을 저장합니다. 그러나, BitSet은 당신에게 그것의 비밀 정보를 보여줄만큼 충분하지 못하기 때문에 각 비트 인덱스를 순서대로 얻어야합니다. 즉, 바이트를 직접 사용하는 것보다 int로 변환하는 것이 실제적인 이점이 없다는 것을 의미합니다.
불필요한 오버 헤드가 발생하지 않으므로 Stefan Haustein (BitSet을 모방하는 데 필요한만큼 확장 됨) 솔루션이 저장소 요구 사항에 적합합니다.
첫 번째 문장은 사실이 아닙니다. 저장소는 바이트 단위 또는 더 큰 단위로 구성되며, 여러 메모리 액세스 및 간단한 계산보다 훨씬 느린 순서. –
조직 및 메모리 액세스 비율에 대해서는 정확하지만 캐시도 고려해야합니다. 나는 그것을 설명하기 위해 내 대답을 고칠 것이다. –
여기에 캐시가 어떻게 관련되어 있는지 알지 못합니다. 이것은 실제로 압축에 관한 것이 아니라 단지 하나의 비트를 바이트가 아닌 단일 비트로서 저장하는 것에 관한 것입니다. –
효율적인 스토리지 또는 효율적인 (즉, 빠른) 읽기/쓰기가 무엇보다 중요합니까? –
나는이 응용 프로그램에서 빠른 읽기/쓰기가 훨씬 더 중요하다고 생각합니다. – navige
모든 배열을 한번 쓰고 읽고 싶습니까? 아니면 특정 배열에 무작위로 액세스해야합니까? – Behe