java - 在 Java 中处理大型字符串列表

标签 java data-structures bigdata hashset

我有一项任务,我必须遍历数十亿行字符串并检查每行是否都是唯一的。 PC 的 RAM 内存中无法容纳所有行本身。此外,行数可能大于 Integer.MAX_VALUE。

我假设处理这种数据量的最佳方法是将每个字符串的哈希码放入某种哈希表中。

所以,这是我的问题:

  1. 我应该用什么代替 String.hashCode()? (返回值为 int,但我可能需要 long)
  2. 处理这种规模的列表的最快方法/框架是什么?我最需要的是能够快速检查列表是否包含元素

最佳答案

你想多了,这一切都可以用一个 MySQL 表非常简单地完成,该表将数据保存到磁盘而不是将所有内容都保存在内存中。独立应用程序从来没有打算有效处理那么多数据。

CREATE TABLE TONS_OF_STRINGS
(
  unique_string varchar(255) NOT NULL,
  UNIQUE (unique_string)
)

只需循环遍历值(假设此处为逗号分隔列表)并尝试插入每个标记。每个失败的 token 都是重复的。

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;
}

完成后不要忘记清除表格,那是很多数据。

关于java - 在 Java 中处理大型字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623571/

相关文章:

java - Java 中的多线程管道

java - 如何根据屏幕可见情况将长 JSON 响应划分为模块以在 ListView 或 RecyclerView 中显示?

java - 使用 CORBA 进行 Java/C++ 互操作的最佳 ORB 是什么?

java - 将图像添加到 JInternalFrame 内的 JPanel

bigdata - 通过高维标称属性预测数值属性

hadoop - 将作业从 talend DI 导出到 talend big data

c++ - 二叉树数据存储实现

algorithm - 请从 Code Jam 2009 解释这个算法

python - 如何为未排序列表编写 pop(item) 方法

hadoop - 了解 HBase Java 客户端