6

嘿stackoverflow社区!

我遇到了一个问题,一个高度参与的算法程序使用的 CPU 利用率太低:在 3% 到 4% 之间。返回结果需要很长时间,而且我相信它还不够努力。

你们中的任何一个天才都知道为什么会发生这种情况 - 如果有的话,我希望 100% 的利用率。一个额外的细节是程序插入到 sqlite3 数据库中,因此是的,我相信有很多通过 sqlite3jdbc 库的 JNI 调用。(请注意,我想早先使用 PreparedQuery 批处理推迟这些插入,但这会导致严重的内存问题 - 有很多数据)。

提前致谢

更新:已修复。是的,我只是个傻瓜,但我没想到 sqlite 会启动一个新事务并做这么多开销。

我现在使用 PreparedStatement 并在插入之前对 32768 个条目进行排队 - 对我来说似乎是一个足够好的数字。

4

4 回答 4

4

如果 IV 型、100% Java 版本可用,我绝不会建议有人使用带有 JNI 的 JDBC 驱动程序。谷歌找到了这个

除此之外,如果没有更多信息,我什么也说不出来。应用程序和数据库是否在同一硬件上运行?

INSERT 有什么“密集”的地方?

我建议分析并获取一些真实数据,而不是猜测。基于信仰的计算对我来说永远不起作用。

于 2009-01-11T23:19:58.683 回答
1

显然,数据库调用导致延迟。创建较小的批次并测试是否有帮助不是一种选择吗?也许你也可以并行化算法,让一个队列在某处获取结果,另一个线程清理该队列?

编辑:

还有一些其他问题领域:

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

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

于 2009-01-11T23:17:49.920 回答
1

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

于 2009-01-11T23:18:11.340 回答
0

磁盘正在减慢您的应用程序。INSERTS 使用磁盘,磁盘很慢,操作系统需要等待写操作完成。

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

于 2009-01-11T23:38:46.447 回答