파일을 생성하는 일괄 처리 작업을 두 번 실행하는 사이에 (텍스트) 파일의 데이터가 얼마나 변경되었는지 확인하고 싶습니다. 파일이 매우 커지므로 이전 파일을 저장하지 않고 새 파일로 diff를 만드는 것을 피하고 싶습니다. 변경된 정확한 바이트 수에 대해별로 신경 쓰지 않아도 충분합니다. 실행 사이에 파일 크기가 다를 수 있습니다. 거기에 알고리즘이 있습니까?두 버전을 저장하지 않고 얼마나 많은 데이터가 변경되었는지 확인하는 방법
답변
이 작업을 수행하는 일반적인 알고리즘을 알지 못합니다. 하지만 당신의 제약 조건을 감안할 때, 나는 매우 간단하다고 생각합니다.
CSV의 모든 행에 대해 32 비트 해시를 계산하고 정렬 된 배열에 저장합니다. 그런 다음 해시를 비교합니다. 해시 중 10 %가 변경된 경우 파일의 10 %가 변경되었을 가능성이 있습니다. (행의 백분율로)
이 값이 너무 크면 각 CSV 행의 32 비트 해시를 계산하지만 각 해시의 마지막 8 비트는 막대 그래프에 저장합니다. 예 : 마지막 바이트가 0 인 10 개의 해시가있는 경우 hist [0] = 10입니다. 그러면 변경된 행의 수를 대략 계산할 수 있습니다.
이 구조체는 256 개의 32 비트 숫자처럼 매우 작습니다. (약 1k)
행이 바뀌면 다른 버킷으로 이동하지만 해당 버킷의 일부 행이 나와서 들어간 행을 마스킹 할 수 있기 때문에 완벽하지 않습니다. 이는 해시 충돌에 문제가 있습니다. 더 많은 비트를 저장할수록 해시 충돌이 줄어들 기 때문에 데이터 구조가 더 커지지만 정확 해집니다.
히스토그램에서 사용하는 해시 비트 수를 늘리면 해시 충돌 확률을 높이거나 낮출 수 있습니다. 예를 들어 각 해시의 하위 12 비트를 사용하면 해시 충돌이 훨씬 적습니다. 데이터 구조는 4k 32 비트 숫자 또는 16k가 될 수 있습니다.
완성 된 아이디어처럼 보이지 않지만 더 나은 아이디어를 가리킬 수 있습니다.
초기 파일을 블록으로 나눕니다. 모든 블록의 해시를 계산합니다. 이 해시를 저장하십시오.
새 파일은 동일한 블록 크기를 사용하지만 다른 (적응 형) 방식으로 블록으로 분할합니다. 첫 번째 줄부터 블록부터 시작하십시오. 알려진 해시가 저장되어 있고 block_size
행을 아래로 이동합니다. 그렇지 않은 경우 해시를 저장하지 말고 1
행을 아래로 이동하십시오.
새 파일이 모두 처리되면 두 개의 해시 시퀀스에 대해 diff 알고리즘을 시도 할 수 있습니다.
대략 변경되거나 삭제 된 콘텐츠의 양을 나타냅니다. 콘텐츠를 추가하려면 두 번째 시퀀스에 무언가를 추가해야 할 것입니다.
- 1. 데이터가 변경되었는지 확인하는 방법
- 2. 어셈블리가 변경되었는지 확인하는 방법
- 3. DependencyProperty가 변경되었는지 확인하는 방법
- 4. listview - 얼마나 많은 페이지가 있는지 확인하는 방법
- 5. 양식 필드 데이터가 변경되었는지 확인하는 방법은 무엇입니까?
- 6. nHibernate 개체가 변경되었는지 확인하는 방법
- 7. 바이트 배열에서 얼마나 많은 비트를 확인하는 방법?
- 8. pcap 데이터에서 얼마나 많은 데이터가 전송되었는지 찾기
- 9. SSL 연결에서 얼마나 많은 데이터가 유출 되었습니까?
- 10. Postgres에서 레코드가 변경되었는지 확인하는 방법
- 11. id 속성이 변경되었는지 확인하는 방법
- 12. 스타일이 컬러로 변경되었는지 확인하는 방법
- 13. ckeditor의 내용이 변경되었는지 확인하는 방법
- 14. C# - 속성이 변경되었는지 확인하는 방법
- 15. 웹 서비스 : 얼마나 많은 데이터가 있습니까?
- 16. 서버의 파일이 다운로드되지 않고 변경되었는지 간단하게 확인하는 방법
- 17. 코어 데이터가 개체를 저장하지 않고 느림
- 18. 양식 데이터가 변경되었는지 확인
- 19. 페이지에서 무엇인가가 변경되었는지 확인하는 방법은 무엇입니까?
- 20. QTable 위젯의 값이 변경되었는지 확인하는 방법
- 21. Meteor 가입 후 얼마나 많은 데이터가 클라이언트에로드됩니까?
- 22. 특정 싱크에서 얼마나 많은 데이터가 전송 되었습니까?
- 23. 파일 해시가 PHP로 변경되었는지 확인하는 방법
- 24. Jquery 변수가 변경되었는지 동적으로 확인하는 방법
- 25. 어떤 파일이 rcs 파일에서 변경되었는지 확인하는 방법
- 26. 얼마나 많은 데이터가 소켓의 송신 버퍼에 있는지 알려주는 방법
- 27. 리포지토리가 변경되었는지 확인하는 명령 (
- 28. 얼마나 많은 행의 데이터가 너무 많은 데이터 행입니까?
- 29. Magento : 주문 값이 변경되었는지 확인하는 방법
- 30. 웹 사이트의 값이 변경되었는지 확인하는 방법
차이점은 무엇입니까? 단지 추가입니까, 아니면 제거 만할까요, 혼합 할 수 있습니까? 차이점은 대개 1 바이트 또는 큰 청크를 만듭니 까? – maxim1000
데이터는 CSV 데이터입니다. 선을 제거하고 추가 할 수 있습니다. 한 줄에있는 필드를 변경할 수 있습니다. 따라서 변경 사항은 1 바이트에서 2000 바이트까지 플러스 또는 마이너스로 실행될 수 있습니다. 가능한 경우 다른 순서의 줄이 변경 횟수에 기여하지 않아야합니다. – chiborg