2016-10-14 11 views
0

У нас есть папка с данными объемом 150 Гб. Внутри этого содержимого файла есть любой формат (doc, jpg, png, txt и т. Д.). Нам нужно проверить все содержимое файла друг против друга, чтобы проверить, существует ли дублирующее содержимое файла. Если да, то распечатайте список имен файлов. Для этого сначала я использовал ArrayList<File> для хранения всех файлов, затем использовал метод FileUtils.contentEquals(file1, file2). Когда я пытаюсь сделать это для небольшого количества файлов (папка), он работает, но для этой папки данных 150 Гб он не показывает никакого результата. Я думаю, что сначала сохранение всех файлов в ArrayList создает проблему. Проблема JVM Heap, я не уверен.Проверить содержимое повторяющегося файла с помощью Java

У кого-нибудь есть лучший совет и образец кода для обработки этого объема данных? Пожалуйста, помогите мне.

+3

Вы пытались вычислить контрольную сумму файла, а не читать? – Prashant

+0

Я напрямую использовал метод FileUtils.contentEquals для проверки файлов для поиска и сохранения результата. – Mostafizur

+0

@Prashant, пожалуйста, напишите мне пример кода для этого? – Mostafizur

ответ

4

Рассчитайте MD5 hash каждого файла и сохраните его в HashMap с хешем MD5 в качестве ключа и пути к файлу в качестве значения. Когда вы добавляете новый файл в 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 байт, независимо от размера содержимого. Поэтому не имеет значения, имеют ли ваши файлы по 150 ГБ каждый или даже больше. Когда вы столкнетесь с новым файлом, вычислите его хэш MD5 и проверьте, уже ли он в HashTable. Поиск и вставка в хэш-таблицу будут амортизированы O(1). Кроме того, у MD5 очень мало шансов на столкновение. Таким образом, чтобы избежать ложных срабатываний, вы можете проверить содержание содержимого в соответствии с совпадением.

Примечание: Я не заметил, что при написании @samgak уже дал подробный ответ. Вы можете использовать фрагмент кода для своего ответа :)

 Смежные вопросы

  • Нет связанных вопросов^_^