2010-05-30 89 views
30

我有大量的數據(幾TB)並累積...它們包含在許多製表符分隔的文本文件中(每個大約30MB)。大部分任務包括讀取數據並基於一系列謂詞語句對觀察值/行進行彙總(彙總/平均+附加轉換),然後將輸出保存爲文本,HDF5或SQLite文件等。我通常使用R對於這樣的任務,但我擔心這可能有點大。一些候選方案是很多文本文件中的大量數據 - 如何處理?

  1. 寫了整個事情在C(或 的Fortran)
  2. 導入的文件(表)到直接在 關係數據庫和 然後決絕的R或Python的 塊(一些變換的不 適合純SQL的解決方案)
  3. 用Python語言編寫整個事情

會(3)是一個壞主意?我知道你可以用Python打包C例程,但是在這種情況下,由於沒有任何計算上的限制(例如,需要許多迭代計算的優化例程),我認爲I/O可能與計算本身一樣是一個瓶頸。您是否有任何關於進一步考慮或建議的建議?由於

編輯感謝您的答覆。似乎有發生衝突約Hadoop的意見,但在任何情況下,我沒有訪問到羣集(雖然我可以用幾個unnetworked機)...

+1

偉大的問題,這聽起來像我與生物序列數據相同的問題。 – Stedy 2010-06-01 18:47:10

回答

13

(3)不一定是一個壞主意 - 的Python可以輕鬆處理「CSV」文件(儘管C代表逗號,Tab作爲分隔符同樣容易處理),並且當然在I/O操作中獲得的帶寬與任何其他語言一樣多。至於其他建議,除了快速計算(您可能不需要按照您的語句),numpy提供了非常方便靈活的多維數組,這對您的任務來說可能非常方便;標準庫模塊multiprocessing允許您針對任何易於並行化的任務利用多個內核(因爲現在幾乎每臺機器都具有多內核;-),因此很重要。

+0

我想我會給Python,NumPy和多處理一個嘗試......非常感謝。 – hatmatrix 2010-05-30 10:38:15

+0

同意。 Python所假設的性能損失在現實世界中並沒有多大表現。 – 2010-05-30 23:25:14

6

看一看Disco。它是一個輕量級的分佈式MapReduce引擎,用大約2000行的Erlang編寫,專門爲Python開發而設計。它不僅支持處理您的數據,而且還可以可靠地存儲複製。他們剛剛發佈了0.3版本,其中包括索引和數據庫層。

+0

謝謝 - 我必須留意迪斯科。儘管我在數據庫層找不到太多文檔,但也許MapReduce框架目前不適合我的硬件...... – hatmatrix 2010-05-30 10:37:26

+0

Discodb是一個窮人的數據庫。它基本上只是一個位於ddfs之上的分佈式散列表。我自己也不太瞭解,因爲它太新穎了。 – 2010-05-30 22:14:48

2

如果您擁有一組機器,則可以使用Hadoop Mapreduce並行化您的應用程序。雖然Hadoop是用Java編寫的,但它也可以運行Python。您可以檢出以下鏈接指針在並行代碼 - PythonWordCount

+0

謝謝〜沒有這個網絡機羣集雖然... – hatmatrix 2010-05-30 12:42:55

1

是。你是對的! I/O會花費你大部分的處理時間。我不建議你使用分佈式系統,比如hadoop來完成這個任務。

你的任務可以在一個適中的工作站完成。我不是Python專家,我認爲它支持異步編程。在F#/ .Net中,該平臺對此非常支持。我曾經做過一個圖像處理工作,將20K圖像加載到磁盤上並將它們轉換成特徵矢量只需要花費幾分鐘的時間。總而言之,並行加載和處理數據並將結果保存在內存(如果很小),數據庫(如果很大)中。

+0

謝謝 - 我希望如此。我所擁有的只是一些適度的工作站(有時候) – hatmatrix 2010-05-30 12:41:47

4

使用千兆字節,無論如何都需要將讀取操作並行化到多個磁盤;所以不妨直接進入Hadoop。

使用Pig或Hive查詢數據;都對用戶定義的轉換有廣泛的支持,所以你應該能夠實現你使用自定義代碼所需做的。

+0

不知道豬或蜂巢 - 會記住這一點...... – hatmatrix 2010-05-30 12:42:05

13

好吧,只是爲了不同,爲什麼不是R?

  • 你似乎知道[R,所以你可能會得到工作代碼每個文件快速
  • 30 MB是RAM的幾個GB標準的工作站上並不大
  • read.table()read.csv()變體可以是非常有效的如果您通過colClasses參數指定類型的列:不是guestimating類型轉換,這將有效地處理
  • 這裏的瓶頸是I/O從磁盤,這是對每一種語言
  • R具有0相同在多核心機器上設置並行處理(類似於Python的多處理,看起來好像)
  • 如果你想採用問題的'尷尬平行'結構,R有幾個非常適合數據處理的軟件包,並行問題:例如snowforeach可以分別部署在一臺機器上或一臺聯網機器上。
+0

我認爲它可以用R完成,但我覺得它的一部分不是正確的工具?雖然所有額外的考慮,你已經包括它當然可以工作......我最近開始使用data.frame(掃描(文件名,什麼=列表(...))),以加快輸入,但指定colClasses可能只是另一個好主意。謝謝〜 – hatmatrix 2010-05-31 05:46:08

+2

@Stephen不要忘記檢查這個線程http://stackoverflow.com/questions/1727772/quickly-reading-very-large-tables-as-dataframes-in-r – Marek 2010-05-31 08:44:31

+0

謝謝!我一直是一個長期的R用戶,但這是非常有幫助的 – hatmatrix 2010-06-01 01:26:00

2

當你說「積累」,那麼解決方案(2)看起來最適合於問題。
初始加載到數據庫後,您只能用新文件更新數據庫(每日,每週?取決於您需要多長時間一次)。 (1)和(3)您每次需要處理文件(之前所述的大部分時間/資源消耗),除非您找到存儲結果並用新文件更新它們的方法。

您可以使用R處理從csv到例如SQLite數據庫的文件。

+0

啊,是的,我明白你的意思......但是一旦我處理每個文本文件,我會將結果最有可能存儲在SQLite文件中並工作與這些結果進行後分析。我所做的彙總是一種時間平均(這是縱向數據),所以我不必在分析當前文件時重新導入以前的文件(這就是爲什麼MapReduce會有意義,我猜...)。 – hatmatrix 2010-06-01 03:02:33

4

我在Amazon的Elastic Map Reduce上使用R和Hadoop的運氣不錯。通過EMR,您只需支付您使用計算機的時間,而AMZN負責啓動和停止實例。具體如何構建EMR中的工作真的取決於您的分析工作流程的結構。例如,一個作業所需的所有記錄是否完​​全包含在每個csv中,還是需要每個csv中的位來完成分析?

下面是一些你可能會發現有用的資源:

我在博客文章中提到的問題更多的是CPU綁定,而不是IO綁定。你的問題是更多的IO,但加載庫和緩存文件的提示可能會有用。

儘管試圖將其推入/移出關係數據庫是一種誘惑,但我建議您仔細考慮是否真的需要RDB的所有開銷。如果你不這樣做,那麼你可能會創造一個瓶頸和發展挑戰,而沒有真正的獎勵。

+0

非常感謝 - 我想問一個問題,是否值得將數據傳輸到基礎設施的開銷? – hatmatrix 2010-06-02 06:20:59