嘿stackoverflow社区!
我遇到的问题是高度参与的算法程序正在使用TOO LITTLE cpu利用率:介于3%到4%之间。返回结果需要很长时间,而且我认为这还不够努力。
你们中的任何一位天才都有任何想法会发生这种情况 - 如果有的话,我会期望100%的利用率。另外一个细节是该程序插入到sqlite3数据库中,因此,我相信通过sqlite3jdbc库有很多JNI调用。 (请注意,我之前想要使用PreparedQuery批处理延迟这些插入,但这会导致严重的内存问题 - 有大量数据)。
提前致谢
更新:已修复。是的,我只是一个doofus,但我没想到sqlite会启动一个新的事务,并且做了很多开销。
我现在使用PreparedStatement并在插入之前排队32768个条目 - 对我来说似乎是一个足够好的数字。
答案 0 :(得分:4)
如果类型IV,100%Java版本可用,我绝不会建议有人使用带有JNI的JDBC驱动程序。 Google发现this一个。
除此之外,没有更多信息,我无法说出任何话。应用程序和数据库是否在同一硬件上运行?
关于INSERT的“密集”是什么?
我建议分析并获取一些真实数据而不是猜测。基于信仰的计算永远不适合我。
答案 1 :(得分:1)
显然数据库调用导致延迟。是不是可以选择创建较小的批次并测试是否有帮助?也许您可以将算法并行化,以便在某处获取结果,另一个线程清除该队列?
编辑:
还有一些其他问题领域:
应考虑所有这些因素
答案 2 :(得分:1)
如果您正在编写大量数据,那么听起来您可能受到磁盘限制。看看机器上的磁盘io统计数据,如果这确实是瓶颈,要么找到更好的io硬件,要么找出如何做更少的写入。
答案 3 :(得分:0)
磁盘正在减慢您的应用。 INSERTS使用磁盘,磁盘速度慢,操作系统需要等待写操作完成。
你不能使用2个线程,一个用于算法,另一个用于插入吗? 如果您只进行插入,您也可以将其写入文本文件,并在以后执行