2016-11-19 72 views
2

我想解決一個問題。我很感謝你對此的寶貴意見。多處理大文件數量

問題聲明: 我正在嘗試在同一個基本目錄中讀取很多文件(10 ** 6的順序)。每個文件具有的圖案(YYYY-MM-DD-HH)相匹配的名稱,並且在文件的內容如下

mm1, vv1 
mm2, vv2 
mm3, vv3 
. 
. 
. 

其中mm是白天和vv的分鐘」是一些數字值就那一分鐘而言。考慮到開始時間(例如2010-09-22-00)和結束時間(例如2017-09-21-23),我需要找到所有vv的平均值。

所以基本上用戶會爲我提供一個start_dateend_date,我就必須得到所有文件的平均給定日期範圍之間。因此,我的函數將是這樣的:

get_average(start_time, end_time, file_root_directory): 

現在,我想了解我是如何利用多來平均的小塊,然後建立在這得到最終值。

注:我不是在尋找線性解決方案。請告訴我如何在較小的塊中解決問題,然後總結出來以找出平均值。 我曾嘗試在python中使用multiprocessing模塊創建4個進程池,但我無法弄清楚如何保留內存中的值並將結果添加到所有塊中。

+0

除了範圍很廣,還不清楚你想知道什麼。也就是說,在進程之間進行通信的一種通用(並且非常常見)的方式是使用一個或多個'multiprocessing.Queue'對象。 – martineau

+0

嗯,我同意這個陳述很寬泛,我也同意實際上沒有文件系統可以在一個目錄中處理10^6個文件。這就是說我這裏的主要目標是建立一個原型 – Geek

回答

0

您的過程將被I/O限制。 多處理可能不是非常有用,如果不起反作用。

此外,基於大量小文件的存儲系統並不是最好的。你應該看一下時間系列數據庫,比如influxdb。

+0

同意這個過程將被I/O限制,但我正在尋求解決文件的問題。在數據庫中存儲數據不是我的選擇,因爲我不處理數據生成 – Geek

+0

即使您不處理數據生成,仍然可以處理它們以使它們更易於查詢。它真的取決於你的查詢模式:一次或經常,大量數據或稀疏。 – Setop

0

鑑於實際處理是微不足道的—使用多個進程或線程的每個文件—的總和和計數不會獲得太多。這是因爲90%以上的努力是打開每個文件並將其內容傳輸到內存中。

但是,最明顯的分區將基於每個數據文件方案。因此,如果搜索範圍是2010-09-22-002017-09-21-23,那麼對於總共61,368個文件(包括兩個閏日),每個小時一個文件可能有七年(可能?)。至少到目前爲止,6.1萬個進程在一個系統上運行得並不是非常有效的—。 (幾年後它可能會是一個合理的能力)。但是對於一個真正的(非超級計算)系統來說,將問題劃分爲幾個部分,可能是可用於工作的CPU數量的兩倍或三倍。這臺電腦有四個內核,所以我首先會嘗試12個進程,每個進程獨立計算1/12文件的總和和計數(當前樣本數量,如果可變)。

通過使用線程可以消除進程間通信。或者對於面向過程的方法,爲每個進程設置一個管道來接收結果是一件很簡單的事情。

+0

謝謝你的回覆。我明白61k過程不是正確的。我還有一臺4核心的機器,我只是想擴展一些東西,所以即使每次處理4次都對我有好處。你能否提供一些示例代碼和庫來完成任務。即使你可以分享一些你曾經使用過的博客或在線鏈接,但是非常感謝! – Geek