2014-04-09 38 views
0

我有一個20 + GB的數據集的結構如下:大數據文件:讀取和創建結構化文件

1 3 

1 2 

2 3 

1 4 

2 1 

3 4 

4 2 

(注:重複是故意的,有在任一列沒有內在的順序)

我想構建以下格式的文件:

1: 2, 3, 4 

2: 3, 1 

3: 4 

4: 2 

這裏是我的問題;我曾嘗試在Python和C++中編寫腳本來加載文件,創建長字符串,並逐行寫入文件。然而,似乎兩種語言都無法處理手邊的任務。有沒有人有任何建議如何解決這個問題?具體來說,是否有一個特定的方法/程序是最佳的呢?任何幫助或指導方向將不勝感激。

+1

究竟是什麼問題了嗎?是因爲你的數據不適合內存嗎? – adrin

+0

請提供你的代碼,所以我們可以看到這個問題。什麼是你的輸入文件類型? – najjarammar

回答

0

你可以試試這個使用Hadoop。您可以運行獨立的Map Reduce程序。映射器將輸出第一列作爲鍵,第二列作爲值輸出。所有具有相同鍵的輸出都將傳送到一個減速器。所以你有一個密鑰和一個值的列表與該密鑰。您可以運行值列表並輸出(key,valueString),這是您所需的最終輸出。你可以用一個簡單的hadoop教程來啓動它,並按照我的建議做mapper和reducer。但是,我沒有試圖在獨立的hadoop系統上擴展20GB的數據。你可以試試。希望這可以幫助。

0

您是否嘗試過使用std::vector一個std::vector

外向量表示的每一行。外部向量中的每個插槽都是一個包含每一行所有可能值的向量。這假定行#可以用作向量的索引。

否則,你可以嘗試std::map<unsigned int, std::vector<unsigned int> >,其中關鍵是行數與向量包含該行的所有值。

A std::list of 也可以。

請問您的程序運行內存不足?

編輯1:處理大型數據文件
您可以通過將它像一個合併排序處理您的問題。
爲每個行號打開一個文件。 將第二列值追加到文件中。 讀完所有數據後,關閉所有文件。 打開每個文件並讀取值並將其打印出來,逗號分隔。每個鍵

0
  1. 打開輸出文件。
  2. 在遍歷源文件的行時,會將值附加到輸出文件中。
  3. 加入輸出文件。
0

一個有趣的想法也on Stack Overflow

發現如果你想堅持一個大字典,你基本上是在尋找一個數據庫。

作爲推薦在那裏,使用Python的sqlite3的模塊寫入到其中主密鑰被自動遞增一個表,具有被稱爲「關鍵的」(或「左」)字段和被稱爲「值」字段(或「對」)。

然後從MIN(key)和MAX(key)表中選擇出來,並且通過該信息,您可以按排序順序選擇具有相同「鍵」(或「左」)值的所有行和打印這些信息到OUTFILE(如果數據庫是不是一個很好的爲你輸出)。

我已經寫在你把這個問題稱爲「大數據」,因爲鍵的數量不合身到內存(否則,一個簡單的Python字典就足夠了),假設這種方法。但是,恕我直言,這個問題沒有正確標記爲「大數據」:爲了需要Hadoop的或類似的分佈式計算,輸入數據應該比你可以在一個單一的硬盤驅動器持什麼樣的,或者你的計算應該是非常非常多比簡單的哈希表查找和插入更昂貴。