2

我有一个 Java 程序,它可以访问一些网站,将网站的 HTML 转换为 XML,然后在 XML 上运行一些 xquery 命令,最后将结果存储到 csv 中,然后将其上传到云文件存储(如 Amazon S3)。

现在,我想将工作拆分为多个线程,以便更快地完成 - 但是我如何确定最适合我的工作的线程数?

对于不同类型的 Amazon EC2 实例,我想确定我应该允许的线程数……是否有库或框架可以帮助我解决这个问题?

或者,我是否必须在 Amazon EC2 实例上手动运行代码,并不断更改线程数并测量所用时间?

具体来说,我想在处理所有线程所花费的总时间与允许同时运行的线程数之间保持平衡......如果我能清楚地看到具有不同 CPU/RAM 容量的不同服务器的这种相关性,那么很棒...任何建议/指导将不胜感激...

4

3 回答 3

3

您描述的工作类型几乎可以肯定是 I/O 限制的——大部分时间都花在等待下载或上传数据上。如果是这样,您的目标只是充分利用上传/下载带宽。

如果是这样,最佳线程数将超过机器上的物理内核数(这将是 CPU 密集型进程的正确起点)。

从这些信息中很难说最佳线程数是多少,因为这取决于您下载的数量以及链接的速度。尝试将线程数加倍,直到性能开始受到影响。

于 2012-08-17T16:44:53.650 回答
2

我认为您应该使用 JHAT、MAT 等使用单线程分析您的应用程序......然后根据您要运行的机器配置决定多少线程。它会让您大致了解线程的成本。然后,您可以运行负载测试(例如 10,000 个项目在 10 个线程中排队)来验证您提出的限制,并进行相应的调整。

于 2012-08-17T16:33:43.250 回答
1

要查找可用的逻辑核心数,您可以使用:

int processors = Runtime.getRuntime().availableProcessors();

ThreadPool并与那么多人一起创造一个。也可以看看 :

在 Java 中查找内核数

Java:如何根据 cpu 内核扩展线程?

于 2012-08-17T16:48:08.097 回答