2009-01-11 160 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