2012-10-19 212 views
2

我正在研究讀取大文件(500 Mo)的java獨立應用程序,將這些文件(protobuf消息 - Google api)反序列化並將其插入到Oracle 11 DB中。集羣Java獨立應用程序

重要的是,數據庫中有一個主表,並且有幾個小表(可以與字典進行比較)。 對於所有字典,我有一個谷歌緩存(番石榴)。 主表沒有緩存。在主表中只有插入,不更新,不刪除。

目前,此應用程序運行在單個JVM上。 (可能,我可以添加多線程。)

我想使它適用於多個JVM。 我的問題是要知道該怎麼做才能獲得更高的性能並使其正常工作。 我發現了兩個問題:如果將應用程序集羣化,我可以同時讀取多個文件,如何更快地插入主表,以及如何更新緩存?

有人對此有所瞭解嗎?

+0

請仔細標註標籤。這不是[標籤:聚類分析](又名:聚類,一種數據挖掘技術),但你想要並行化。 –

+0

你是對的。感謝編輯。 –

回答

2

如何使插入到主錶快

大獎!您必須識別您的瓶頸,並且很可能它正在讀取文件或數據庫。文件很簡單,只需拆分它們並放在不同的機器上。當然,在同一臺機器上運行多個JVM將無濟於事,因爲它們都將爭奪I/O。因此,您必須拆分這些文件並將它們與JVM一起分發到多臺機器上。

我認爲反序列化protobuf不是瓶頸,它需要一些CPU,但不是那麼多。

最後你有一個數據庫。單個單線程JVM可能會充分利用數據庫,但值得嘗試。首先讓你的應用程序多線程,看看它是否有幫助。

如何更新緩存?

累積獎金。您還必須分配/集羣緩存。番石榴緩存是不夠的,你需要更復雜的東西,如RMI集羣EhCache,兵馬俑或Hazelcast。基本上它們提供緩存API,但通知羣集的其他成員緩存已更改並且需要失效。

BTW 500 MiB並不是那麼多,需要多長時間來處理?同樣,你必須通過簡介來找到什麼讓你放慢腳步。

+0

感謝您的回答。我會提供更多關於下週過去的時間的信息,因爲我不想因爲說錯什麼而犯錯。不過,我不能說插入過程很慢,但我希望它能夠管理更多的文件。 –

+0

BTW protobuf真的很快,但它使用了大量的內存......這是限制。再次感謝。下週更多信息。 –