我有一个场景,其中
- 具有特定格式的巨大输入文件,必须读取以\n 分隔,它有近 2000 万条记录。
- 必须读取和处理每条记录,方法是将其以特定格式发送到服务器。
=====================
我正在考虑如何设计它。
- 读取文件(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/