Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 具有数组和多参数的Python多处理_Python 2.7_Multidimensional Array_Python Multiprocessing_H5py - Fatal编程技术网

Python 2.7 具有数组和多参数的Python多处理

Python 2.7 具有数组和多参数的Python多处理,python-2.7,multidimensional-array,python-multiprocessing,h5py,Python 2.7,Multidimensional Array,Python Multiprocessing,H5py,所以我试图读入一堆非常大的数据文件,每一个都需要相当长的时间来加载。我正试图找出如何以最快的方式加载它们,而不会遇到内存问题。一旦数据文件以正确的方式加载到阵列中,我就不需要写入它们,只需要读取它们。我已经试着将其并行化了一段时间,但无法理解 假设我有400个时间档案。这些文件中的每一个都是以制表符分隔的,有30个变量,每个变量有40000个数据点。我想创建一个400x30x4000阵列,以便轻松访问点。 设置数据文件时,第一个40k点用于变量1,第二个40k点用于变量2,依此类推 我已经编写了

所以我试图读入一堆非常大的数据文件,每一个都需要相当长的时间来加载。我正试图找出如何以最快的方式加载它们,而不会遇到内存问题。一旦数据文件以正确的方式加载到阵列中,我就不需要写入它们,只需要读取它们。我已经试着将其并行化了一段时间,但无法理解

假设我有400个时间档案。这些文件中的每一个都是以制表符分隔的,有30个变量,每个变量有40000个数据点。我想创建一个400x30x4000阵列,以便轻松访问点。 设置数据文件时,第一个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
files是由
子流程加载的时间文件列表。check_output
(大约有400个元素),header是从另一个文件(其中有30个元素)加载的变量列表。numPts是每个变量的点数(大约40k)

我尝试使用
pool.map
加载数据,但发现它不喜欢多个参数。我还尝试使用了partial、zip和lambda函数,但它们似乎都不喜欢我的数组


我对这种方法不是一成不变的。如果有更好的方法,我将不胜感激。一次加载一个数据需要很长时间。我的计算表明,使用一个内核在我的计算机上加载大约需要3小时。我会用掉很多记忆。我可以访问另一台拥有更多内核的机器,这正是我要做的,我想正确地利用它们。

所以我是如何使用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(系统总使用量)以上,在运行后会下降到gig以下