2012-08-23 81 views
1

在我的應用程序中,我必須讀取大量的數據。在獲得所有數據後,我將它放在一個列表中並對其進行處理,並據此進行工作。以最高效的方式從數據庫中獲取大量數據

現在我想知道如果我可以做任何事情,任何加快從數據庫過程中獲取數據?我的數據庫位於不同的服務器上,我正在使用java與數據庫進行交互。

我沒有確定的數據大小,即我需要處理的特定行數。另外我聽說我可以去多線程,但那怎麼辦呢?因爲我不知道如何分割我的數據,因爲它是不確定的。也就是說,如果下面的僞代碼被應用

for(i=0 to number of partition) // Not certain on the number of partitions 
    create new thread and get data. 

也許我可以將某些屬性的基礎上,散列數據和以後告訴每個線程獲取地圖的某一特定指數,但後來如何映射它甚至在獲取數據之前?

我可以看看所有可能的解決方案,我該如何解決?讓我知道你是否需要更多信息。

謝謝。

+0

我們在談論多少數據?你可以在數據庫中執行一些處理嗎?目前的瓶頸是什麼? –

+0

我想,多線程獲取數據是一個不錯的選擇。您可以創建一個模型,在該模型中需要提供單個線程要獲取的記錄總數。 –

回答

3

我聽說我可以去多線程,但那怎麼辦呢?

這對於加快從遠程服務器查詢信息是一個很好的選擇。
通常在這些任務中 - 帶服務器的IO是主要瓶頸,並且通過多線程 - 可以同時「請求」多行 - 有效減少IO等待時間。

但是後來怎麼辦呢?

這個想法是將工作分成更小的任務。有關更多詳細信息,請參閱java high level concurrency API
一個解決方案是讓每個線程從服務器讀取一個大小爲M的塊,並在每個線程仍然存在數據(服務器)的情況下爲每個線程重複該過程。類似的東西(每個線程):

data = "start"; 
int chunk = threadNumber; 
while (data != null) { 
    requestChunk(chunk); 
    chunk += numberOfThreads; 
} 

我這裏假設你一旦「越界」的服務器返回null(或requestChunk()過程,並返回null)。

也許我可以將某些屬性的基礎上,散列數據和以後告訴 每個線程獲取地圖的特定指數

如果您需要遍歷數據,並取回所有的它 - 散列通常是一個不好的解決方案。這種緩存效率非常低,而且這種情況下的開銷太大。

+0

hw我會在這裏討論多線程嗎?請看看僞代碼。我能做什麼?謝謝 – Kraken

+0

@Kraken:我編輯它 - 是否更清楚? – amit

+0

是的。謝謝 :) – Kraken

相關問題