我有一个任务,我必须通过几十亿字符串并检查,每个是否是唯一的.所有线路本身都不能容纳在PC的RAM存储器中.此外,行数可能大于Integer.MAX_VALUE.
我假设处理这些数据量的最佳方法是将每个字符串的哈希码放入某种HashTable中.
所以,这是我的问题:
>我应该使用什么而不是String.hashCode()? (返回值为int,但我可能需要很长时间)
>使用此大小的列表的最快方法/框架是什么?我最需要的是能够快速检查列表是否包含元素
解决方法
你在想这个问题,这一切都可以通过一个
MySQL表来完成,它将数据保存到磁盘而不是将所有内容保存在内存中.那么多数据从来就不是由独立应用程序有效处理的.
CREATE TABLE TONS_OF_STRINGS ( unique_string varchar(255) NOT NULL,UNIQUE (unique_string) )
只需循环遍历值(假设这里以逗号分隔的列表)并尝试插入每个标记.每个失败的令牌都是重复的.
public static void main(args) { Connection con = DriverManager.getConnection("jdbc:MysqL://localhost/database","username","password"); FileReader file = new FileReader("SomeGiantFile.csv"); Scanner scan = new Scanner(file); scan.useDelimiter(","); String token; while ( scan.hasNext() ) { token = scan.next(); try { PreparedStatement ps = con.prepareStatement("Insert into TONS_OF_STRING (UNIQUE_STRING) values (?)"); ps.setString(1,token); ps.executeUpdate(); } catch (sqlException e) { System.out.println("Found duplicate: " + token ); } } con.close(); System.out.println("Well that was easy,I'm all done!"); return 0; }
完成后不要忘记清除表格,这就是大量数据.