【问题标题】:Dividing a large file in multithreaded application?在多线程应用程序中划分大文件?
【发布时间】:2015-06-05 22:45:37
【问题描述】:

在一次我无法回答的采访中,有人问我这个基本问题:

我们如何在多线程之间划分一个大文件来处理它?如果 我们正在运行一个多线程应用程序,输入是一个大文件 我们必须为每个线程提供文件的一部分以使其快速。 我们如何在 Java 中实现它?

谁能解释一下我们将如何做到这一点?任何示例也将不胜感激。

【问题讨论】:

  • 你看到这个答案了吗http://stackoverflow.com/questions/17927398/how-to-split-a-large-text-file-into-smaller-chunks-using-java-multithread
  • ^ 请做一个链接。
  • 这里有一个谬误。磁盘,因此文件,不是多线程的。多线程是否会更快,这是值得怀疑的。可能更慢。
  • @EJP 假设磁盘可以处理多线程。
  • 你会用Java8吗?如果那你为什么不看看蒸汽。大文件内存映射文件会更好

标签: java multithreading algorithm


【解决方案1】:

获得3个起始位置

    File f = new File("xxx");
    long size = f.length();
    long p1 = 0;
    long p2 = f.length() / 3;
    long p3 = p2 + f.length() / 3;

将要读取的位置和长度传递给线程,将文件移动到位置并读取 n 个字节

    FileInputStream is = new FileInputStream("xxx");
    FileChannel c= is.getChannel();
    c.position(position);
    // read ...

【讨论】:

  • 你的意思是long p3 = f.length() - p2;你的方式,p2 == p3
  • 长 p3 = p2 + f.length() / 3;应该是这样的
  • 感谢您添加示例。如果可能的话,您能否逐步添加更多解释,这将如何工作?什么位置在这里也意味着什么?我以前从未使用过positionFileChannel,所以任何一步一步的解释都会有很大帮助。
  • 位置是 InputStream 读取下一个字节的起点。当我们第一次打开 FileInputStream position = 0;当我们读取 1 个字节时,位置移动到 1。 FileChannel 允许将位置设置为文件内的任何位置。在我们的例子中,我们将线程 2 设置为文件长度的 1/3,胎面 2 设置为文件长度的 2/3
  • 好的,知道了。在通过线程读取所有文件结束时,我们是否需要将任何内容与此解决方案合并?
【解决方案2】:

在采访中,回答应该是这是一个消费者-生产者的问题。 所以你应该有 1 个生产者线程读取文件并将这些行放入一个同步的集合中,比如 Vector,你可以有 n 个消费者线程从集合中获取行并处理它们。

如果有助于准备另一个面试问题可能是:超线程、死锁、忙等待。

有一些面试书籍,比如破解代码面试,或者 Java 编程面试暴露。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多