java - 提高 IO 性能和速度

标签 java io

我需要从压缩文本文件中读取和写入大量字符串(每个字符串行 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/

相关文章:

java - 无法从类 io.netty.channel.sctp.nio.NioSctpChannel 创建 channel

java在用户输入之前在控制台中写字母

java - 从java中的项目文件夹加载图像

c - 如何读取存储在二进制文件中的数组或变量,并在程序中打印出来?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

c - 通过探测从缓冲区写入文件,C 程序

java - 如何正确地将时间字符串转换为日期对象

java - 如何从Servlet中的隐藏字段中获取数组值?

java - ArrayList<Double> 插入(java)

java - JUnit 测试布局