Java中CPU利用率过低

6

嘿,stackoverflow社区!

我有一个问题,一个高度涉及算法的程序使用了太少的CPU利用率:在3%和4%之间。它需要很长时间才能返回结果,我认为它只是没有充分发挥作用。

你们这些天才中是否有人知道为什么会出现这种情况 - 如果有的话,我希望能达到100%的利用率。另外一个细节是该程序将数据插入sqlite3数据库,因此是的,通过sqlite3jdbc库进行了许多JNI调用。(请注意,我想早些时候使用PreparedQuery批处理推迟这些插入操作,但这引起了严重的内存问题 - 数据量很大)。

提前感谢。

更新:已解决。是的,我只是个傻瓜,但我没想到sqlite会启动一个新事务并做出如此多的开销。

我现在使用PreparedStatement,在插入前排队32768个条目 - 我觉得这个数字足够好。

4个回答

4
我不建议使用带有JNI的JDBC驱动程序,如果有100% Java版本的类型IV可用,则应使用该版本。您可以在Google上找到这个

除此之外,如果没有更多信息,我无法做出任何判断。应用程序和数据库是否在同一台硬件上运行?

什么使插入操作如此“密集”?

我建议进行分析并获取一些实际数据,而不是猜测。基于信仰的计算从来都不适合我。


1

很明显,数据库调用正在导致延迟。有没有可能创建更小的批次并测试是否有所帮助??也许您可以并行算法,将结果放入某个队列中,并使用另一个线程清除该队列?

编辑:

还有一些其他问题区域:

  • 数据库优化(模型)
  • 数据库服务器配置
  • 磁盘速度

所有这些因素都应考虑在内。


1

如果你正在写大量数据,那么听起来你可能会受到磁盘限制。查看机器上的磁盘IO统计信息,如果实际上是瓶颈,要么找到具有更好IO的硬件,要么想办法减少写入。


0

磁盘正在拖慢您的应用程序。插入操作使用磁盘,磁盘速度较慢,操作系统需要等待写操作完成。

您不能使用两个线程吗?一个用于算法,另一个用于插入操作?如果您只进行插入操作,您也可以将它们写入文本文件,并在以后执行。


多线程通信比将更新排队并在同一线程中刷新更新要慢,对于那些不是“天生线程安全”的程序员来说,也更加复杂,容易出现错误。 - Blaisorblade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接