0

所以我想讀一堆非常大的數據文件,每個需要相當一些時間來加載。我想弄清楚如何以最快的方式加載它們,而不會遇到內存問題。一旦數據文件被加載到數組中正確的方式我不需要寫入它們,但只需要閱讀。我一直在嘗試並行化這段時間,但無法弄清楚。Python多處理與數組和多個參數

假設我有400個時間文件。每個文件都是製表符分隔的,每個文件有30個變量,每個變量有40,000個數據點。我想創建一個400x30x40000陣列,以便我可以輕鬆訪問這些點。 數據文件的設置使得前40k點用於變量1,第二個40k用於var 2,依此類推。

我寫了一個函數,正確加載時間文件並將其正確存儲在我的數組中。我遇到的麻煩是將其並行化。如果我將它放在for循環中並遍歷i,這會起作用。

import h5py 
import pandas as pd 
h5file = h5py.File('data.h5','a') 
data = h5file.create_dataset("default",(len(files),len(header),numPts)) 
     # is shape 400x30x40000 
def loadTimes(files,i,header,numPts,data): 
    # files has 400 elements 
    # header has 30 elements 
    # numPts is an integer 
    allData = pd.read_csv(files[i],delimiter="\t",skiprows=2,header=None).T 
    for j in range(0,len(header)): 
     data[i,j,:] = allData[0][j*numPts:(j+1)*numPts] 
    del allData 

文件是由subprocess.check_output(具有約400的元件)的加載時間文件列表中,頭是變量列表,從另一文件中加載(在具有30種元素)。 numPts是每個變量的點數(大約40k)。

我試過使用pool.map加載數據,但發現它不喜歡多個參數。我也嘗試使用partial,zip和lambda函數,但沒有一個似乎喜歡我的數組。

對於這種方法,我不是一成不變的。如果有更好的方法來做到這一點,我將不勝感激。一次只加載一個數據只需要很長的時間。我的計算表明,使用一個內核加載我的電腦需要大約3個小時。我會用盡我很多的記憶。我可以訪問另一臺擁有更多內核的機器,這實際上就是我要做這件事的地方,而且我想正確使用它們。

回答

0

所以我如何解決這是使用h5文件格式。我所做的就是寫循環,使他們只用了ITER

def LoadTimeFiles(i): 
    from pandas import read_csv 
    import h5py as h5 
    dataFile = h5.File('data.h5','r+') 
    rFile = dataFile['files'][i] 
    data = dataFile['data'] 
    lheader = len(data[0,:,0]) 
    numPts = len(data[0,0,:]) 
    allData = read_csv(rFile,delimiter="\t",skiprows=2,header=None,low_memory=False).T 
    for j in range(0,lheader): 
     data[i,j,:] = allData[0][j*numPts:(j+1)*numPts] 
    del allData 
    dataFile.close() 

def LoadTimeFilesParallel(np): 
    from multiprocessing import Pool, freeze_support 
    import h5py as h5 
    files = h5.File('data.h5','r') 
    numFiles = len(files['data'][:,0,0]) 
    files.close() 
    pool = Pool(np) 
    freeze_support 
    pool.map(LoadTimeFiles,range(numFiles)) 

if __name__ == '__main__': 
    np = 5 
    LoadTimeFilesParallel(np) 

所以,因爲我存儲在H5格式的數據無論如何,我以爲我會很棘手,在每個循環加載它(我可以在閱讀h5文件時看不到時間延遲)。我將選項low_memory=False添加到read_csv命令中,因爲它使它更快。 j循環非常快,所以我不需要加速。

現在每個LoadTimeFile循環需要大約20-30秒,我們立即做5,而沒有秩序問題。我的內存從未達到3.5Gb以上(系統總使用率),並在運行之後回落到演出之下。