【问题标题】:Check for unique line data from file with 5 millions lines in Java在 Java 中检查具有 500 万行的文件中的唯一行数据
【发布时间】:2011-07-06 09:53:50
【问题描述】:

我有一个像ID|VALUE 这样的行的大文件。

如果ID重复,则必须忽略行。

如何有效地进行这种检查?
添加: ID 很长(8 个字节)。我需要一个使用最少内存的解决方案。
谢谢你们的帮助。我现在能够增加堆空间并使用 Set。

【问题讨论】:

  • 我尝试使用 Map 进行对存储并得到“内存不足异常”
  • @Sarge - 增加堆空间怎么样?
  • 在这个项目中是不可能的。我无法更改 java 选项。

标签: java collections fileparsing


【解决方案1】:

您可以将数据存储在 TLongObjectHashMap 或使用 TLongHashSet。这些类有效地存储基于基元的信息。

500 万长值将在 TLongHashSet 中使用

了解更多关于这些课程的信息

http://www.google.co.uk/search?q=TLongHashSet

http://www.google.co.uk/search?q=TLongObjectHashMap

【讨论】:

  • 课程来自trove library,顺便说一句
  • 我不能使用额外的库。
【解决方案2】:

无论如何,您都必须将 ID 存储在某个地方以检测重复项。在这里,我将使用 HashSet<String> 及其 contains 方法。

【讨论】:

  • ID 很长(8 字节)。在 HashSet 中存储 500 万长需要大量内存。
【解决方案3】:

您必须读取整个文件,一次一行。您必须保留一组 ID,并将传入的 ID 与 Set 中已有的值进行比较。如果出现值,请跳过该行。

您自己编写了用例;这里没有魔法。

【讨论】:

  • 我需要一个使用最少内存的解决方案。套装不合适
【解决方案4】:

对我来说,这看起来像是一个典型的数据库任务。如果您的应用程序中使用了数据库,则可以利用它来完成您的任务。创建一个具有 UNIQUE INTEGER 字段的表并开始添加行;你会在重复的 ID 上得到一个例外。数据库引擎将负责光标窗口和缓存,因此它适合您的内存预算。然后在完成后放下该表。

【讨论】:

  • 我将值放到表格中。我使用 executeBatch 进行插入,不能只捕获异常并忽略它。
  • 嗯,如果您仍然向表中添加值,为什么不让数据库完成这项工作呢?我不会进行批量插入,而是开始一个事务,在其中嵌套一个带有 try 的循环,它只是忽略重复 ID 上的异常,并最终提交事务。插入事务的速度非常快。我会说它可能比批量插入要慢,但肯定比预过滤重复要快(更不用说内存效率更高了)。
【解决方案5】:

有两种基本的解决方案;

首先,正如上面 duffymo 和 Andreas_D 所建议的,您可以将所有值存储在 Set 中。这会给你 O(n) 的时间复杂度和 O(n) 的内存使用量。

其次,如果O(n)内存太多,可以牺牲速度在O(1)内存中做。对于文件中的每一行,读取它之前的所有其他行,如果 ID 出现在当前行之前,则丢弃。

【讨论】:

    【解决方案6】:

    probabilistic algorithms 呢?

    布隆过滤器 ... 是一种节省空间的概率数据结构,用于测试元素是否是集合的成员。可能会出现误报,但不会出现误报。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多