【问题标题】:Use multi threading to read files/processing using Java?使用多线程读取文件/使用 Java 处理?
【发布时间】:2015-12-21 12:16:45
【问题描述】:

所以我之前没有真正做过任何认真的多线程处理(除了典型的 for-loop 教科书示例),所以我想我可以尝试一下。我要完成的任务如下:

  1. 从名为ids.txt 的文件中读取识别码
  2. 在名为sequence.txt 的单独文件中搜索该识别码
  3. 找到标识后,提取 id 后面的字符串。
  4. 创建一个DataSequence类型的对象(封装了识别码和提取的序列)并将其添加到一个ArrayList中。
  5. 重复 3000 多个 ID。

我已经在单个线程中尝试过这种“常规”方式,但过程太慢了。如何以多线程方式解决这个问题?

【问题讨论】:

  • 你能告诉我们一些你尝试过的代码吗?我们不能只给你答案,我们必须向你展示它是如何工作的。
  • 这些文件有多大?是否可以将它们加载到内存中(尤其是sequence.txt)?无论如何,我强烈建议您在尝试将多线程作为解决方案之前,对您的代码进行概要分析,以准确了解时间的去向。如果你要走这条路,那么你绝对应该将线程数限制在合理的范围内(例如,8 或 16)。
  • 我所拥有的只是带有 for 循环的常规单线程方法。够了吗?
  • @TedHopp 'sequence.txt' 为 53.3 MB。 “ids.txt”为 6.57 KB。虽然,其他方法可能是可能的,但我也有兴趣在这里学习多线程。
  • 你想出这个任务是为了学习如何使用线程,还是仅仅解决问题更重要?我有一种感觉,大多数人会继续建议做多线程以外的事情来解决这个特定问题。另一方面,可以想出一个不同的练习,其中多线程带来的性能提升会更加明显。

标签: java multithreading file io


【解决方案1】:

多线程在这里可能有点过头了。尝试以下算法方法。 1.以读取方式打开文件ids.txt 2.声明一个HashMap用于存储键值对 2.循环到文件末尾 2A。将一行读取为字符串 2B。将行解析为 id(键)和行的其余部分(值)以存储在 HashMap 对象中 3. 现在根据需要使用 HashMap 进行搜索,或者用它做任何你需要的事情。

注意:2A 和 2B 可以放在生产者-消费者设计框架中的两个不同线程的两个不同任务中。

【讨论】:

    【解决方案2】:

    没有查看分析数据,很难知道该推荐什么。但作为一个盲目的猜测,我会说反复打开、搜索和关闭sequence.txt 占用了大部分时间。如果这是正确的猜测,那么(到目前为止)最大的改进将是找到一种方法来只处理一次sequence.txt。最简单的方法是将文件中的相关信息读入内存,构建一个从 id 到其后面的字符串的哈希映射。整个文件只有 53.3 MB,所以这是一个非常合理的方法。然后在处理ids.txt 时,您只需要从地图中查找相关字符串——这是一个非常快速的操作。

    另一种方法是使用java.nio 类为sequence.txt 创建内存映射文件。

    我会犹豫是否寻求多线程来改进似乎是磁盘绑定操作的操作,特别是如果线程最终都将争夺对同一个文件的访问(即使它只是读取访问)。这对我来说并不是一个学习多线程技术的好问题。回报不太可能存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多