CountingBloomFilter를 제거할 수 없습니다.

4808 단어 hadoop-bloomfilter

묘사

   run test case like this :

@Test
public void testBasics() {
    final CountingBloomFilter cbf = new CountingBloomFilter(100, 2,
            Hash.MURMUR_HASH);

        // ready to add 100 market 
    for (int i = 0; i < 100; i++) {
        Key key = new Key(("abc" + i).getBytes(UTF8));
        cbf.add(key);
    }

          // find and remove 
    for (int i = 0; i < 100; i++) {
        Key key = new Key(("abc" + i).getBytes(UTF8));
        assertTrue("key present after insertion", cbf.membershipTest(key));

        cbf.delete(key);
        assertFalse("key gone after deletion", cbf.membershipTest(key));
    }
}

 result : 

java.lang.AssertionError: key gone after deletion
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.assertTrue(Assert.java:41)
at org.junit.Assert.assertFalse(Assert.java:64)
at org.apache.hadoop.util.bloom.CountingBloomFilterTest.testBasics(CountingBloomFilterTest.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
.Hadoop에서 코드를 추출했습니다.나는 정말 이것이 예기한 행위인지 아닌지 모르겠다.블룸 필터는 본질적으로 확률적이기 때문에 해시는 삭제해야 할 키를 기억할 수 있을 것이라고 추측했다.답변에 감사드립니다. 저는 잘 모르겠습니다. 우선 테스트를 하고 10개의 요소를 추가한 다음에 10개의 요소를 삭제한 다음에 삭제 여부를 테스트합니다. 삭제가 다른 요소에 미치는 영향입니다.
@Test
public void testBasics() {
    final CountingBloomFilter cbf = new CountingBloomFilter(10, 2,
            Hash.MURMUR_HASH);

    for (int i = 0; i < 10; i++) {
        Key key = new Key(("abc" + i).getBytes(UTF8));
        cbf.add(key);
    }

    String keyStr = null;
    for (int i = 0; i < 10; i++) {
        keyStr = "abc" + i;
        Key key = new Key(keyStr.getBytes(UTF8));
        //assertTrue("key present after insertion", cbf.membershipTest(key));
        System.out.println("delete before , member ship test key : " + keyStr + " , " + cbf.membershipTest(key));

        cbf.delete(key);
        //assertFalse("key gone after deletion", cbf.membershipTest(key));
        System.out.println("delete after , member ship test key : " + keyStr + " , " + cbf.membershipTest(key));
    }
}
결과: +1:
삭제하기 전에 구성원 선박 테스트 키: abc0, 참
삭제 후 구성원 선박 테스트 키: abc0, 참
삭제하기 전에 구성원 선박 테스트 키: abc1, 참
삭제 후 구성원 선박 테스트 키: abc1, 참
삭제 전, 구성원 선박 테스트 키: abc2, 정확
삭제 후 구성원 선박 테스트 키: abc2, 정확
삭제 전, 구성원 선박 테스트 키: abc3, 참
삭제 후 구성원 선박 테스트 키: abc3, 오류
삭제 전, 구성원 선박 테스트 키: abc4, 정확
삭제 후 구성원 선박 테스트 키: abc4, 정확
삭제 전, 구성원 선박 테스트 키: abc5, 참
삭제 후 구성원 선박 테스트 키: abc5,false
삭제 전, 구성원 선박 테스트 키: abc6, 정확
삭제 후 구성원 선박 테스트 키: abc6, 오류
삭제 전, 구성원 선박 테스트 키: abc7, 정확
삭제 후 구성원 선박 테스트 키: abc7, 참
삭제 전, 구성원 선박 테스트 키: abc8, 참
삭제 후 구성원 선박 테스트 키: abc8, 오류
삭제 전, 구성원 선박 테스트 키: abc9, 정확
삭제 후 구성원 선박 테스트 키: abc9, 오류
왜 삭제에 추가되었습니까? 추가 값은 여전히 무엇입니까?삭제해도 다른 결과에 오류가 발생합니까?
예컨대
삭제하기 전에 구성원 선박 테스트 키: abc0, 참
삭제 후 구성원 선박 테스트 키: abc0, 참
........
정확한 결과는 이렇습니다. 삭제에 가입하고 다시 가짜를 찾아야 합니다. 가짜는 여기서 진실로 돌아가고 진정한 삭제가 없다고 합니다!

좋은 웹페이지 즐겨찾기