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以上(系统总使用率),并在运行之后回落到演出之下。