Java高效读取大数据文件---较优方法

数据背景,一个文件大小>=10G,每一行都是一个json对象数据 如下:

{"id":"C0D962","time":"2015-09-01 23:59:54","lon":"113.534","lat":"22.214",……}

高效读取的方法:

 readLine()占用总时间的80%,使用BufferedReader,每次读入5M数据.减少IO.如:

BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),5*1024*1024);

业界评价:IO本身就是瓶颈,提高IO数据吞吐量的办法,使用BufferedReader已经是一个很好的选择了。速度最快的方法,当然是MappedByteBuffer,但是,相比BufferedReader而言,效果不是非常明显。也就是说,后者虽然快,但是,也快的有限。楼主不要抱着新能提升几倍的幻想了。


目前,楼主的需求而看,采用MappedByteBuffer读取数据,是最佳选择。


要是不用多线程(多线程提升潜力也不大),那么,换磁盘阵列 是个不错的选择。你要是还不明白是怎么回事,那就把磁盘型号抄下来,去网上搜一搜,磁盘的读写速度就知道了。

public void largeFileIO(String inputFile, String outputFile) {
	try {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(inputFile)));
		BufferedReader in = new BufferedReader(new InputStreamReader(bis, "utf-8"), 10 * 1024 * 1024);//10M缓存
		FileWriter fw = new FileWriter(outputFile);
		while (in.ready()) {
			String line = in.readLine();
			fw.append(line + " ");
		}
		in.close();
		fw.flush();
		fw.close();
	} catch (IOException ex) {
		ex.printStackTrace();
	}
}

或者不加缓存参数

public static void read(String filePath) {
	try {
		String encoding = "GBK";
		File file = new File(filePath);
		if (file.isFile() && file.exists()) {
			InputStreamReader read = new InputStreamReader(
						new FileInputStream(file), encoding);
			BufferedReader bufferedReader = new BufferedReader(read);
			while (bufferedReader.ready()) {
				String line = bufferedReader.readLine();
				System.out.println(line);
			}
			bufferedReader.close();
			read.close();
		} else {
			System.out.println("找不到指定的文件");
		}
	} catch (Exception e) {
	}
}

转载自   https://blog.csdn.net/xiangyong58/article/details/51702252 

猜你喜欢

转载自blog.csdn.net/Qgwperfect/article/details/89874310