【发布时间】:2011-05-02 08:11:13
【问题描述】:
我正在开发一个包含大约 400 个输入文件和大约 40 个输出文件的程序。 这很简单:它读取每个输入文件并生成一个新文件,但文件要大得多(基于算法)。
我正在使用 BufferedReader 的 read() 方法:
String encoding ="ISO-8859-1";
FileInputStream fis = new FileInputStream(nextFile);
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, encoding));
char[] buffer = new char[8192] ;
要读取我正在使用的输入文件:
private String getNextBlock() throws IOException{
boolean isNewFile = false;
int n = reader.read(buffer, 0, buffer.length);
if(n == -1) {
return null;
} else {
return new String(buffer,0,n);
}
}
对于每个块,我都在做一些检查(比如查看块内的一些字符串),然后将其写入文件:
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("fileName"), encoding));
writer.write(textToWrite);
问题是大约需要 12 分钟。 我正在尝试更快地找到其他东西。 有人对更好的东西有什么想法吗?
谢谢。
【问题讨论】:
-
您是否尝试过对不同的缓冲区大小进行基准测试?
-
瓶颈是文件 IO 还是您用来组合数据的算法?
-
@CC 如果我的回答没有给您带来任何速度提升,您可以随时尝试线程池读取操作。进行同时读取可以提高性能(但也可能降低性能)
-
文件大小是多少?硬盘的速度是多少?
-
如果您正在读取/写入本地驱动器(网络驱动器会慢得多)需要 12 分钟(例如 6 正在读取),则文件的读取大小必须约为 10 GB对于写入或平均大约 25 MB 读取和 250 MB 写入。这听起来对吗?如果是你的磁盘就是你的极限。如果不是,那么 I/O 就不是您的瓶颈。
标签: java performance file-io