我想读一个大文本文件

时间:2010-06-11 11:22:15

标签: java

我想读一个大文本文件,我决定创建四个线程并读取每个文件的25%。 然后加入他们。

但它并不令人印象深刻。 任何人都可以告诉我,我可以使用并发编程。 因为我的文件结构有一些数据 姓名联系方式compnay policyname policynumber uniqueno

我希望最后将所有数据都放在hashmap中。

感谢

5 个答案:

答案 0 :(得分:9)

读取大文件通常受I / O性能的限制,而不受CPU时间的限制。你不能通过分成多个线程来加速读取(它会降低性能,因为它仍然是同一个驱动器上的同一个文件)。您可以使用并发编程来处理数据,但这只能在读取文件后提高的性能。

然而,您可以通过专用一个线程来读取文件,并在读取数据单元时将实际处理从该线程委派给工作线程。

答案 1 :(得分:1)

如果它是一个大文件,它可能是作为一个连续的部分写入磁盘并且“流式传输”,数据将比并行读取更快,因为这将开始来回移动磁头。要了解什么是最快的,您需要对目标生产环境有深入的了解,因为在高端存储上,数据可能会分布在多个磁盘上,并行读取可能会更快。

我认为最好的方法是将大块内容读入内存。使其可用作ByteArrayInputStream来进行解析。

很可能在解析和处理数据期间会挂断CPU。也许并行map-reduce可以帮助将负载分散到所有核心上。

答案 2 :(得分:1)

您可能希望使用内存映射文件缓冲区(NIO)而不是普通的java.io。

答案 3 :(得分:0)

好吧,如果你这样做,你可能会刷新磁盘缓存并对hashmap的同步产生很大的争用。我建议您只需确保已正确缓冲流(可能具有较大的缓冲区大小)。使用BufferedReader(Reader in, int sz)构造函数指定缓冲区大小。

如果瓶颈未解析线条(即瓶颈不是CPU使用率),则不应按照描述的方式并行化任务。

您还可以查看内存映射文件(可通过nio包获得),但这可能仅在您希望有效读取和写入文件时才有用。这里有一个包含源代码的教程:http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ314_029.htm

答案 4 :(得分:0)

您可以从以下链接中获取帮助

http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

OR

使用大缓冲区

或使用此

import java.io。*;

public class line1 {

public static void main(String args[]) {
  if (args.length != 1) {
    System.err.println("missing filename");
    System.exit(1);
  }
  try {
    FileInputStream fis =
        new FileInputStream(args[0]);
    BufferedInputStream bis =
        new BufferedInputStream(fis);
    DataInputStream dis =
        new DataInputStream(bis);
    int cnt = 0;
    while (dis.readLine() != null)
      cnt++;
    dis.close();
    System.out.println(cnt);
  }
  catch (IOException e) {
    System.err.println(e);
  }
}

}