java - 设计 : A Java Application with high throughput

标签 java multithreading nio

我有一个场景,其中

  1. 具有特定格式的巨大输入文件,必须读取以\n 分隔,它有近 2000 万条记录。
  2. 必须读取和处理每条记录,方法是将其以特定格式发送到服务器。

=====================

我正在考虑如何设计它。
- 读取文件(nio)
- 读取文件的线程可以将这些 block 保存到 JMS 队列中。
- 创建 n 个线程代表 n 个服务器(数据要发送到的服务器)。然后并行运行的 n 个线程可以一次获取一个 block 。通过向服务器发送请求来执行该 block 。

如果以上内容没问题,或者您发现任何缺陷,您能否提出建议 :)。如果您能建议更好的方法/技术来做到这一点,那就太好了。



谢谢!

已更新:我编写了一个程序来读取包含 20m 记录的文件,使用 Apache Commons IO(文件迭代器)我以 block 的形式读取文件(一次 10 行)。并在 1.2 秒内读取文件。这有多好?我应该考虑去 nio 吗? (当我确实放了一个日志来打印 block 时,它花了将近 26 秒!)

最佳答案

2000 万条记录实际上并没有那么多,所以首先我会尝试正常处理它,您可能会发现性能很好。

之后你需要测量一些东西。

您需要按顺序从磁盘读取以获得良好的速度,因此必须是单线程的。

您不希望磁盘读取等待网络或网络等待磁盘读取,因此将读取的数据放入队列是个好主意。为了获得最佳性能,您可能需要大于一行的 block 大小。测量不同 block 大小的性能以查看。

您可能会发现网络发送已经比磁盘读取快了。如果是,那么你就完成了,如果不是,那么此时你可以启动更多线程从队列中读取并用它们进行测试。

所以你的调整因素是:

  • block 大小
  • 线程数。

确保您针对各种组合在适当数量的数据上衡量性能,以找到最适合您的情况的组合。

关于java - 设计 : A Java Application with high throughput,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22066469/

相关文章:

java - JFrame 的序列化删除了 JButton 的 ActionListener - Java

java - 二维数组上的 ArrayIndexOutOfBoundsException 错误

java - 编码问题

c++ - 在没有共享 COM 对象的情况下使用 COM STA 或 MTA?

java - Files.newInputStream 中的 NoSuchFileException 与 StandardOpenOption.CREATE

java - 无法在 NIO 中获取输出

java - JAVA中特殊字符之间的匹配字符串

java - 即使线程被声明为 null JAVA,线程仍继续运行

multithreading - 多线程编程-生产者消费者

java - 关于何时应该将直接缓冲区与 Java NIO 一起用于网络 I/O 的简单规则?