2016-10-14 16 views
0

150GB 데이터 폴더가 있습니다. 그 안에 파일 내용은 모든 형식 (doc, jpg, png, txt 등)입니다. 중복 된 파일 콘텐츠가 있는지 확인하기 위해 모든 파일 콘텐츠를 서로 검사해야합니다. 그렇다면 파일 경로 이름 목록을 인쇄하십시오. 이를 위해 먼저 ArrayList<File>을 사용하여 모든 파일을 저장 한 다음 FileUtils.contentEquals(file1, file2) 메서드를 사용했습니다. 소량의 파일 (폴더)을 시도 할 때 작동하지만이 150Gb 데이터 폴더의 경우 아무런 결과도 표시되지 않습니다. 먼저 ArrayList에 모든 파일을 저장하면 문제가 발생합니다. JVM 힙 문제, 확실하지 않습니다.Java를 사용하여 중복 파일 내용 확인

누구나이 양의 데이터를 처리하기위한 더 나은 조언과 샘플 코드가 있습니까? 도와주세요.

+3

파일을 읽는 대신 체크섬을 계산해 보았습니까? – Prashant

+0

FileUtils.contentEquals 메서드를 직접 사용하여 파일의 look을 확인하고 결과를 저장했습니다. – Mostafizur

+0

@Prashant 저에게 샘플 코드를 써주시겠습니까? – Mostafizur

답변

4

각 파일의 MD5 hash을 계산하고 MD5 해시를 키로, 파일 경로를 값으로 사용하여 HashMap에 저장하십시오. HashMap에 새 파일을 추가하면 MD5 해시가있는 파일이 이미 있는지 쉽게 확인할 수 있습니다.

가짜 일치의 가능성은 매우 낮지 만 원하는 경우 FileUtils.contentEquals를 사용하여 일치를 확인할 수 있습니다.

예컨대 : 여러 개의 동일한이 첫 번째와 그들 각각의 일치를 찾을 파일,하지만 서로 그들 모두의 일치가있는 경우

void findMatchingFiles(List<String> filepaths) 
{ 
    HashMap<String, String> hashmap = new HashMap<String, String>(); 
    for(String filepath in filepaths) 
    { 
     String md5 = getFileMD5(filepath); // see linked answer 
     if(hashmap.containsKey(md5)) 
     { 
      String original = hashmap.get(md5); 
      String duplicate = filepath; 

      // found a match between original and duplicate 
     } 
     else 
     { 
      hashmap.put(md5, filepath); 
     } 
    } 
} 

. 후자를 원하면 MD5 문자열의 해시를 첫 번째 파일 경로 대신 파일 경로 목록에 저장할 수 있습니다.

1

HashTable을 사용하고 파일 내용의 MD5 해시를 키와 파일 경로로 값으로 저장하십시오. MD5 해시 크기는 콘텐츠 크기에 관계없이 16 바이트입니다. 따라서 파일 크기가 150GB 이상인 지 상관 없습니다. 새 파일을 발견하면 해당 MD5 ​​해시를 계산하고 이미 해시 테이블에 있는지 확인하십시오. 해시 테이블의 조회 및 삽입은 O(1)으로 상각됩니다. 게다가 MD5는 충돌 가능성이 거의 없습니다. 따라서 가양 성을 피하기 위해 일치하는 파일 내용을 확인할 수 있습니다.

참고 : @samgak을 쓰는 동안 이미 정교한 답을 얻었지만주의를 기울이지 않았습니다. 코드 스 니펫에 그의 대답을 사용할 수 있습니다.