2010-10-05 61 views
2

我有一個設計問題。我有一個3-4 GB的數據文件,按時間戳排序。我想弄清楚處理這個文件的最好方法是什麼。要讀取5GB文件

我正在考慮將這整個文件讀入內存,然後將這些數據傳輸到不同的機器,然後在這些機器上運行我的分析。

在運行我的分析之前將它上傳到數據庫是明智的嗎?

我打算在不同的機器上運行我的分析,所以通過數據庫進行分析會更容易,但如果我增加運行數量的機器運行,我對數據庫的分析可能會變得太慢。

任何想法?

@update:

我想逐個處理記錄。基本上試圖在時間戳數據上運行模型,但我有各種模型,因此需要分發它,以便整個過程每天運行一整夜。我想確保我可以輕鬆增加模型的數量並且不會降低系統性能。這就是爲什麼我打算將數據分發給所有運行該模型的機器(每臺機器將運行一個模型)。

+1

http://en.wikipedia.org/wiki/MapReduce? – 2010-10-05 16:24:03

+0

我想補充一點,這將是一項日常任務。 – silencer 2010-10-05 16:24:46

+3

@ user465353,您需要執行的分析的性質是什麼?你需要對整個記錄集進行比較嗎?或者是純粹逐行分析? – 2010-10-05 16:28:03

回答

1

在運行我的分析之前將它上傳到數據庫中是明智的嗎?

我打算跑我在不同機器上分析,這樣做時,通過數據庫會更容易些,但如果我增加數量的機器來運行我的數據庫上的分析可能會太慢。

不用擔心,它會沒事的。只需引入一個標記,以便識別每臺計算機處理的行。

我不確定我是否完全理解你的所有需求,但是如果你需要堅持數據(不止一次引用它),那麼db就是要走的路。如果您只需處理這些輸出文件的部分內容並信任結果,則可以在不存儲任何內容的情況下即時完成。

只存儲您需要的數據,而不是文件中的所有數據。

+1

聽起來好像OP是在關注性能。 *數據庫路由*將會是最慢的實現。聽起來我們正在談論數百萬行插入。 – 2010-10-05 16:23:39

+0

抱歉沒有添加,我想每天運行這個。將它上傳到數據庫還是明智的嗎? – silencer 2010-10-05 16:25:47

+1

@ user465353告訴我們更多關於如何分析數據的信息,如果您需要查看整個數據集或者是否可以逐一處理行/記錄,那麼它會產生很大的影響。 – nos 2010-10-05 16:44:28

2

您甚至可以訪問硬盤本身的文件並一次讀取一小塊。對於Java,Java有一些稱爲隨機訪問文件的內容,但同樣的概念在其他語言中也是可用的。

是否要加載到數據庫中,並且分析應完全由需求決定。如果您可以讀取該文件並隨時處理它,則無需存儲到數據庫中。但是爲了分析,如果你需要來自數據庫的所有不同區域的數據將是一個好主意。

1

您不需要將整個文件存入內存,只需要分析所需的數據。您可以讀取每一行並僅存儲該行所需的部分,並且還存儲該行以文件開始的索引,因此如果需要來自該行的更多數據,則可以稍後再找到它。

0

根據所需的分析,這聽起來像是一個使用MapReduce與Hadoop的教科書案例。它將支持您未來添加更多機器的要求。看一下Hadoop wiki:http://wiki.apache.org/hadoop/

從概述開始,讓獨立的設置工作在一臺機器上,然後嘗試對文件進行簡單的分析(例如以「grep」開頭)。有一些組件需要,但一旦你有配置的東西,我認爲這可能是你正確的道路。

0

最近我有一個類似的問題,就像@lalit提到的那樣,我使用RandomAccess文件閱讀器來對付位於硬盤上的文件。

在我來說,我只需要讀訪問文件,所以我發起了一堆線程,每個線程在不同的點上文件的開始,這讓我所做的工作,這確實提高了我的吞吐量,因爲每個線程在進行某些處理時可能會花費大量時間,同時其他線程可能正在讀取該文件。

像我提到的一個程序應該很容易編寫,試試看看性能是否是你需要的。

0

@update:

我想逐個處理記錄。基本上試圖在時間戳數據上運行模型,但我有各種模型,因此需要分發它,以便整個過程每天運行一整夜。我想確保我可以輕鬆增加模型的數量並且不會降低系統性能。這就是爲什麼我打算將數據分發給所有運行該模型的機器(每臺機器將運行一個模型)。