2009-01-11 159 views
6

嗨,stackoverflow社区!Java中CPU利用率太低

我遇到了一个高度涉及的算法程序正在使用太小cpu利用率的问题:介于3%和4%之间。返回结果花费很长时间,我相信这只是不够努力。

你们任何一个天才都有任何想法,为什么会出现这种情况 - 如果有任何事情我会期望100%的利用率。另外一个细节是程序插入到sqlite3数据库中,因此是的,我相信通过sqlite3jdbc库有很多JNI调用。 (请注意,我想尽早将这些插入与PreparedQuery批处理延期,但是这会导致严重的内存问题 - 有大量数据)。

在此先感谢

更新:修正。是的,我只是做了一个doofus,但我没想到sqlite会启动一个新的事务并且花费太多的开销。

我现在在插入之前使用PreparedStatement和队列32768条目 - 对我来说好像是一个足够好的数字。

回答

1

很明显,数据库调用导致延迟。是不是创建小批量和测试是否有帮助?也许你可以对算法进行并行化处理,让队列在某个地方获得结果,另一个线程清理队列?

编辑:

还有其他一些问题领域:

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

所有这些因素都应该应予以考虑

1

如果您正在编写大量数据,那么您听起来可能会受到磁盘限制。看看机器上的磁盘io统计数据,如果这实际上是瓶颈,那么要么找到具有更好io的硬件,要么找出如何减少写入。

4

如果可以使用类型IV,100%的Java版本,我绝不会推荐某人使用带有JNI的JDBC驱动程序。 Google找到了this之一。

除此之外,没有更多的信息我什么也不知道。应用程序和数据库是否在相同的硬件上运行?

关于INSERT的是什么“密集”?

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

0

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

你不能使用2个线程,一个用于算法,另一个用于插入? 如果您只进行插入,您也可以写入文本文件,稍后再执行它们

+0

多线程通信比排队更新并在同一线程中刷新它们要慢,而且更复杂得到无bug对于不是“线程安全”的程序员来说。 – Blaisorblade 2009-01-12 01:41:43