使用数组和多个参数进行Python多处理

时间:2015-10-26 22:20:25

标签: python-2.7 multidimensional-array python-multiprocessing h5py

所以我试图读取一堆非常大的数据文件,每一个都需要相当长的时间才能加载。我试图弄清楚如何以最快的方式加载它们,而不会遇到内存问题。一旦数据文件以正确的方式加载到数组中,我就不需要写入它们,而只需要阅读。我一直试图将其并行化一段时间,但无法弄明白。

假设我有400个时间档案。这些文件中的每一个都是制表符分隔的,有30个变量,每个变量有40,000个数据点。我想创建一个400x30x40000阵列,以便我可以轻松访问这些点。 设置数据文件,使得前40k点用于变量1,第二个40k用于变量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小时。而且我会消耗很多记忆。我可以访问另一台具有更多内核的机器,这实际上就是我要做的事情,我想正确使用它们。

1 个答案:

答案 0 :(得分: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个没有订单问题。我的ram从未达到3.5Gb以上(系统总使用量)并在运行后回落到一个演出之下。