【问题标题】:Java- Parsing a large text fileJava-解析大文本文件
【发布时间】:2013-04-08 07:43:18
【问题描述】:

我有一个简短的问题。我正在做一个学校项目,我需要解析一个非常大的文本文件。这是一个数据库类,所以我需要从文件中获取唯一的演员名称,因为演员将是 mysql 数据库中的主键。我已经编写了解析器并且效果很好,但当时我忘记删除重复项。所以,我决定最简单的方法是创建一个演员数组列表。 (使用 ArrayList ADT)然后使用 contains() 方法检查演员名称是否在 arraylist 中,然后再将其打印到新的文本文件中。如果是我什么都不做,如果不是我将它添加到数组列表并打印到页面。现在程序运行非常缓慢。在arraylist之前,大约花了5分钟。旧的演员文件是 180k,没有删除重复项。现在它已经运行了 30 分钟,到目前为止是 12k。 (这次我预计总共有 100k-150k。)

我将arraylist的大小留空,因为我不知道文件中有多少个actor,但至少有1-2百万。我当时正在考虑只投入 500 万美元,然后检查它是否得到了全部。 (只需检查最后一个 arraylist 索引,如果为空,它没有用完空间。)这会减少时间,因为 arraylist 不会不断加倍并重新复制所有内容吗?还有比这更快的方法吗?我还担心我的计算机在完成之前可能会耗尽内存。任何建议都会很棒。

(我也尝试在文本文件上运行 'unique' 命令但没有成功。演员名称每行打印 1 个。(在一列中)我在想命令可能是错误的。你将如何从windows 或 linux 命令提示符中的文本文件列?)谢谢你,很抱歉发了这么长的帖子。我明天有期中考试,开始感到压力。

【问题讨论】:

  • 使用集合而不是列表。 Set 的 contains 效率更高,并且会删除重复项。如今,您需要很多 GB 才能变得非常大。我会称 TB 非常大,尽管这也变得越来越普遍。如果你担心500万太多,我建议你计算一百万使用多少内存,估计你需要多少内存。
  • 您只能在对元素进行排序后对元素执行“唯一”操作,如果您的文件大小小于 GB,您应该在几分钟内完成(或几秒钟,具体取决于您的工作量)处理这些数据)
  • 我仍然有一个重复的问题,这没有意义。所以程序设置要做的是读取生产者名称,然后我使用 producer.add(producername) 将名称添加到 HashSet。在程序终止之前的最后,我使用迭代器将集合一次打印到文本文件中。然后我去尝试将它加载到数据库中,它仍然说它包含重复的条目。这应该是不可能的。具有重复项的文件大小为 50k,使用 HashSet 并打印到文本文件后,结果为 7k。看起来它正在工作。

标签: java parsing text


【解决方案1】:

使用 Set 而不是 List,这样您就不必检查集合是否包含该元素。 Set 不允许重复。

【讨论】:

    【解决方案2】:

    使用 arrayList contains() 查找的成本大约为 O(n) 性能。 我认为这样做一百万次,会杀死你的程序。

    使用 Set 的 HashSet 实现。它可以为您提供理论上恒定的时间查找,并会自动为您删除重复项。

    【讨论】:

    • 谢谢,我听取了大家的建议。基本上都是一样的。现在似乎跑得更快了。文件大小在 3 分钟内增长到大约 12k。使用 arraylist 大约需要 45 分钟。它仍然需要一个小时,但没关系。文本文件大约 1 GB。它包含 80 万多部电影。每部电影都有关键词、演员、导演、年份、时间、评级等。我正在将这个大文件变成大约 8 个较小的文件。除了包含重复的导演、演员和制片人之外,我前一阵子都完成了。套装效果很好,谢谢!
    【解决方案3】:

    -尝试在java中使用内存映射文件以更快地访问大文件

    -使用 HashMap 集合代替 ArrayList,其中键是演员的姓名(或哈希码),这将大大提高速度,因为在 HashMap 中查找键速度很快

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多