Python h5py内存文件和多处理错误

Python h5py内存文件和多处理错误,python,multiprocessing,hdf5,in-memory,h5py,Python,Multiprocessing,Hdf5,In Memory,H5py,这是给你的HDF5和多处理专家。。。首先,我知道pythonh5py和多处理模块不一定相互喜欢,但我遇到了一个我无法理解的错误。我正在使用的脚本创建一个临时内存中的hdf5文件,将(pickle)输入文件中的数据存储在内存中文件中,然后多处理池对临时hdf5文件中的数据执行(只读)操作 我已经能够分离出导致错误的代码,所以这里有一个简化的代码片段。当我在生成器函数中创建内存中的hdf5文件,然后使用该生成器生成多处理池的参数时,会出现一系列hdf5错误。下面是一些代码,我尽可能简单地重新创建错误

这是给你的HDF5和多处理专家。。。首先,我知道pythonh5py和多处理模块不一定相互喜欢,但我遇到了一个我无法理解的错误。我正在使用的脚本创建一个临时内存中的hdf5文件,将(pickle)输入文件中的数据存储在内存中文件中,然后多处理池对临时hdf5文件中的数据执行(只读)操作

我已经能够分离出导致错误的代码,所以这里有一个简化的代码片段。当我在生成器函数中创建内存中的hdf5文件,然后使用该生成器生成多处理池的参数时,会出现一系列hdf5错误。下面是一些代码,我尽可能简单地重新创建错误:

import h5py
from multiprocessing import Pool
from itertools import imap

useMP = True

def doNothing(arg):
    print "Do nothing with %s"%arg

def myGenerator():
    print "Create hdf5 in-memory file..."
    hdfFile = h5py.File('test.hdf',driver='core',backing_store=False)
    print "Finished creating hdf5 in-memory file."
    yield 3.14159
    '''
    # uncommenting this section will result in yet another HDF5 error.
    print "Closing hdf5 in-memory file..."
    hdfFile.close()
    print "Finished closing hdf5 in-memory file."
    '''

if useMP:
    pool = Pool(1)
    mapFunc = pool.imap
else:
    mapFunc = imap

data = [d for d in mapFunc(doNothing,myGenerator())]
当我使用itertools.imap(设置为“useMP=False”)时,正如预期的那样,我得到了以下输出:

Create hdf5 in-memory file...
Finished creating hdf5 in-memory file.
Do nothing with 0
但是,当我使用Pool.imap时,即使该池仅使用一个工作线程创建,我也会得到以下输出:

Create hdf5 in-memory file...
HDF5-DIAG: Error detected in HDF5 (1.8.9) thread 139951680009984:
  #000: ../../../src/H5F.c line 1538 in H5Fopen(): unable to open file
    major: File accessability
    minor: Unable to open file
  #001: ../../../src/H5F.c line 1227 in H5F_open(): unable to open file: time = Wed Feb 27 09:32:32 2013
, name = 'test.hdf', tent_flags = 1
    major: File accessability
    minor: Unable to open file
  #002: ../../../src/H5FD.c line 1101 in H5FD_open(): open failed
    major: Virtual File Layer
    minor: Unable to initialize object
  #003: ../../../src/H5FDcore.c line 464 in H5FD_core_open(): unable to open file
    major: File accessability
    minor: Unable to open file
Finished creating hdf5 in-memory file.
Do nothing with 0
奇怪的是,这个错误并没有使程序崩溃。我正在编写的导致此错误的脚本实际上正如我所期望的那样工作—但它为它创建的每个内存中文件都给出了上述错误。使用itertools.imap时没有错误,读取现有HDF5文件时没有错误,只有多处理和内存中HDF5文件的组合

h5py版本2.1.1

hdf5版本1.8.9


Python 2.7.3版

在深入研究了一些h5py文件之后,我找到了一个大致的答案,尽管仍然不完整。h5py.File类在中定义。在调用make_fid()创建文件对象时出错:

如果文件存在,则以读/写模式打开。如果它不存在(内存中的文件就是这种情况),h5f.open()调用将引发异常。正是调用h5f.open触发了H5Fopen()错误消息

仍然存在的问题是,为什么只有在使用多处理时才会打印错误?首先,我假设创建HDF5文件的生成器函数由主线程调用。嗯,不是。多处理池实际上创建了一个新线程来处理imap和imap_无序的任务,但不处理map/map_异步的任务。将pool.imap替换为pool.map,然后从主线程调用生成器函数,并且不会打印错误消息。那么,为什么在单独的线程中创建HDF5文件会引发错误呢

------更新------------

显然,h5py会自动使主线程中的HDF5错误消息静音,因为h5py会处理错误。但是,它还不能自动消除子线程中的错误。解决方案:
h5py.\u errors.silent\u errors()
。此函数在当前线程中禁用自动HDF5错误打印。见h5py。此代码使HDF5错误静音:

import h5py
from multiprocessing import Pool
from itertools import imap
import threading

useMP = True

def doNothing(arg):
    print "Do nothing with %s"%arg

def myGenerator():
    h5py._errors.silence_errors()
    print "Create hdf5 in-memory file..."
    hdfFile = h5py.File('test.hdf',driver='core',backing_store=False)
    print "Finished creating hdf5 in-memory file."
    yield 3.14159

if useMP:
    pool = Pool(1)
    mapFunc = pool.map
else:
    mapFunc = imap

data = [d for d in mapFunc(doNothing,myGenerator())]

显然,对于线程和多处理,情况也是如此:
import h5py
from multiprocessing import Pool
from itertools import imap
import threading

useMP = True

def doNothing(arg):
    print "Do nothing with %s"%arg

def myGenerator():
    h5py._errors.silence_errors()
    print "Create hdf5 in-memory file..."
    hdfFile = h5py.File('test.hdf',driver='core',backing_store=False)
    print "Finished creating hdf5 in-memory file."
    yield 3.14159

if useMP:
    pool = Pool(1)
    mapFunc = pool.map
else:
    mapFunc = imap

data = [d for d in mapFunc(doNothing,myGenerator())]