设计:具有高吞吐量的Java应用程序

时间:2014-02-27 11:00:29

标签: java multithreading nio

我有一个场景,其中

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

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

    你能否建议以上是否正常,或者你看到任何缺陷:)。如果你能提出更好的方法/技术来做到这一点,那就太好了。


    谢谢!

    更新了:我写了一个程序,用20m记录读取该文件,使用Apache Commons IO(文件迭代器)我以块的形式读取文件(时间10行)。它在1.2秒内读取文件。这有多好?我应该想到去nio吗? (当我确实把日志打印出来时,花了大约26秒!)

2 个答案:

答案 0 :(得分:3)

2000万条记录实际上不是那么多,所以首先我会尝试正常处理它,你可能会觉得性能很好。

之后你将需要衡量一切。

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

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

您可能会发现网络发送速度比磁盘读取速度快。如果是这样,那么你就完成了,如果没有,那么在那时你可以启动更多从队列读取的线程并用它们进行测试。

所以你的调整因素是:

  • 块大小
  • 线程数。

确保您针对各种组合测量大小适中的数据,以找到最适合您情况的数据。

答案 1 :(得分:1)

我相信您可以批量记录而不是一次发送一个。考虑到服务器需要处理的数据量,您可以避免不必要的网络跳跃。