内存错误并行Python(并行大数据)

时间:2016-02-10 23:50:51

标签: python dictionary parallel-processing

所以我从一堆不同的文件中读取了大量数据。其中一个主要的速度障碍是读取数据。问题是这些文件位于各自的时间步长目录中,其中包含该时间步的每个变量。所以基本上我有一些看起来像这样的功能。

def ReadFiles(path,points,directories,variables):
   data = {}
   for j in range(len(variables)):
      data[variables[j]] = np.zeros((len(timeDirs),numPts))
      for i in range(len(timeDirs)):
         tfile = str(path) + "/" + str(timeDirs[i])
         for j in range(len(variables)):
            job_server.submit(ReadData,(args,data,i,j),modules=("np",))
def ReadData(args):
   update path for the particular variable
   read in data from file
   data[variables[j]][i] = that data

TLDR 将numpy数组中的变量初始化为dict。然后在另一个并行化的函数中更新正确的部分。

我正在使用并行python。我想在某个时候将此代码移动到集群。我得到的错误是

  File "/home/steven/anaconda2/lib/python2.7/site-packages/pp.py", line 460, in submit
    sargs = pickle.dumps(args, self.__pickle_proto)
MemoryError: out of memory

从观察我的内存使用情况,我可以看到RAM上升,然后交换开始填充。一旦两者都满了我就会收到错误。从一些阅读中我收集到,每个过程都被传递一个新的字典,这意味着并行更新不是一个选项。

我会注意到,当我连续运行时,我不会收到此内存错误。那么是否有一种很好的方法可以使用并行将这些数据存储或传递回我的字典?最终的数据存储在hdf5文件中,但那些似乎并不想打开并写入并行。

有一个很好的解决方案吗?你如何并行处理大数据?

1 个答案:

答案 0 :(得分:0)

并行阅读数据并不可能获得任何好处,因为只要您一次读取数据,一次读取一个文件或者全部读取数据,您就会受到I / O限制一旦。我打开它来串行读取数据,但是在加载每个文件后启动数据设置(并行,natch)。如果您可以一次性加载整个文件,然后从内存中处理它,您可能会看到所寻求的性能提升,但会牺牲内存。

如果您耗尽内存,那么您需要弄清楚如何写出一些数据,以便您可以删除这些字典条目。

对内存映射文件而不是显式读取它们可能是可行的,然后根据数据处理的速度与I / O的速度并行处理可能更有意义。这将允许您利用操作系统的计划,假设您在加载时的数据处理需要足够长的时间。