我有一台4 GB内存的PC和一个内存使用量为10 GB的文件.现在我想检查一下,如果文件中的每一行都是唯一的,那么我编写了以下代码:
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.HashSet; import java.util.Set; public class Cleaner { public static void main(String[] args) throws IOException { if (args.length < 2) { System.out.println("Too less parameters!"); return; } File file = new File(args[0]); BufferedReader buff = new BufferedReader(new FileReader(file)); String line; Set<String> set = new HashSet<String>(); while ((line = buff.readLine()) != null) { set.add(line); } FileWriter fw = new FileWriter(args[1]); for (String s : set) { fw.write(s + "\n"); fw.flush(); } fw.close(); buff.close(); } }
但我得到一个OutOfMemoryException所以我的问题是:
我应该如何更改代码以获取每行唯一的文件?
提前谢谢你的帮助.
解决方法
您可以尝试首先查找重复的线条哈希以识别潜在的重复线条:
Map<Integer,Integer> hashes = new HashMap<> (); Map<Integer,Integer> dupes = new HashMap<> (); int i = 0; while ((line = buff.readLine()) != null) { int hash = line.hashCode(); Integer prevIoUs = hashes.get(hash); if (prevIoUs != null) { //potential duplicate dupes.put(i,prevIoUs); } else { hashes.put(hash,i); } ++i; }
最后,您有一个潜在的重复列表.如果dupes是空的,则没有重复,如果不是,那么你可以对文件进行第二次传递以检查这些行是否真的相同.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。