我想读一个大文本文件,我决定创建四个线程并读取每个文件的25%。 然后加入他们。
但它并不令人印象深刻。 任何人都可以告诉我,我可以使用并发编程。 因为我的文件结构有一些数据 姓名联系方式compnay policyname policynumber uniqueno
我希望最后将所有数据都放在hashmap中。
感谢
答案 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);
}
}
}