Mos*_*zur 4 java algorithm collections checksum fileutils
我们有一个 150 Gb 的数据文件夹。其中,文件内容可以是任何格式(doc、jpg、png、txt 等)。我们需要相互检查所有文件内容以检查是否有重复的文件内容。如果是,则打印文件路径名列表。为此,我首先使用ArrayList<File>
存储所有文件,然后使用FileUtils.contentEquals(file1, file2)
方法。当我尝试处理少量文件(文件夹)时,它可以工作,但是对于这个 150Gb 数据文件夹,它没有显示任何结果。我认为首先将所有文件存储在 ArrayList 中会产生问题。JVM 堆问题,我不确定。
任何人都有更好的建议和示例代码来处理如此大量的数据?请帮我。
计算每个文件的MD5 哈希值,并以 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果有多个相同的文件,这将找到每个文件与第一个文件的匹配项,但不会找到所有文件之间的匹配项。如果您想要后者,您可以将 MD5 字符串中的哈希存储到文件路径列表中,而不仅仅是存储到第一个。