我需要从压缩文本文件中读取和写入大量字符串(每个字符串行 90 个字符长)。
准备输入/输出也很耗时,但可以忽略(IO 时间要大得多(已分析))
这是我正在使用的代码:
GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(file));
out.write((stringData+NewLineConstant).getBytes());
GZIPInputStream in = new GZIPInputStream(new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in),8192);
String data = bufferedReader.readLine();
该问题需要太多时间才能完成。
这也是通过用于对数据进行排序(合并排序)的多个文件来完成的。
我可以做些什么来显着提高性能吗? (无需更改硬件)
最佳答案
您有关于这些行中前一个或两个字符的分布的信息吗?
如果是这样,您可以读取这个大文件一次,并且可以仅基于这些行的前一个或两个字符创建一两个存储桶(文件)。之后,如果分布均匀,您可以对内存中的这些存储桶进行排序(这些文件将小于 1GB)。
详细来说,它看起来像这样:
- 打开大文件(10GB)
- 打开数十个存储桶文件进行写入(每种类型的行 1 个:aa、ab、...)
- 读取大文件的行,并写入存储桶文件
- 关闭大文件
- 关闭存储桶文件
- 对内存中的存储桶文件进行排序(首先是 aa,然后是 ab,...),这可以并行化,然后追加它们
一般来说,您应该增加读取缓冲区(从 8K 到几兆字节)和写入缓冲区(从 8K 到 256K-512K)。
关于java - 提高 IO 性能和速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9411750/