2013-12-12 2 views
0

큰 (500K x 500K) 매트릭스에 저장 될 플로트 번호가 있습니다. 가변 크기의 배열을 사용하여 청크에 저장합니다 (특정 조건에 따라).h5py, 산발적 쓰기 오류

배열을 생성하고 공유 대기열에 넣는 병렬 코드 (parallellised code)와 대기열에서 튀어 나온 하나의 전용 프로세스를 HDF5 행렬에 하나씩 씁니다. 예상대로 약 90 %의 시간 동안 작동합니다.

때때로 특정 배열에 대한 쓰기 오류가 발생합니다. 여러 번 실행하면 오류가있는 배열이 항상 변경됩니다. 나는 (time.sleep (2)) 쓰기 작업 중 다음 문제가 해결 될 것 같다 2 초 일시 중지를 삽입하면

Process Process-2: 
Traceback (most recent call last): 
    File "/local/software/python3.3/lib/python3.3/multiprocessing/process.py", line 258, in _bootstrap 
     self.run() 
    File "/local/software/python3.3/lib/python3.3/multiprocessing/process.py", line 95, in run 
     self._target(*self._args, **self._kwargs) 
    File "./compute_scores_multiprocess.py", line 104, in writer 
     hdf5_scores[data[0], data[1]:data[2]+1] = numpy.matrix(data[3:]) 
    File "/local/software/python3.3/lib/python3.3/site-packages/h5py/_hl/dataset.py", line 551, in __setitem__ 
     self.id.write(mspace, fspace, val, mtype) 
    File "h5d.pyx", line 217, in h5py.h5d.DatasetID.write (h5py/h5d.c:2925) 
    File "_proxy.pyx", line 120, in h5py._proxy.dset_rw (h5py/_proxy.c:1491) 
    File "_proxy.pyx", line 93, in h5py._proxy.H5PY_H5Dwrite (h5py/_proxy.c:1301) 
OSError: can't write data (Dataset: Write failed) 

: 여기

def writer(in_q): 
    # Open HDF5 archive 
    hdf5_file = h5py.File("./google_matrix_test.hdf5") 
    hdf5_scores = hdf5_file['scores'] 
    while True: 
     # Get some data 
     try: 
      data = in_q.get(timeout=5) 
     except: 
      hdf5_file.flush() 
      print('HDF5 archive updated.') 
      break 
     # Process the data 
     try: 
      hdf5_scores[data[0], data[1]:data[2]+1] = numpy.matrix(data[3:]) 
     except: 
      # Print faulty chunk's info 
      print('E: ' + str(data[0:3])) 
      in_q.put(data) # <- doesn't solve 
     in_q.task_done() 

def compute(): 
    jobs_queue = JoinableQueue() 
    scores_queue = JoinableQueue() 

    processes = [] 
    processes.append(Process(target=producer, args=(jobs_queue, data,))) 
    processes.append(Process(target=writer, args=(scores_queue,))) 
    for i in range(10): 
     processes.append(Process(target=consumer, args=(jobs_queue,scores_queue,))) 

    for p in processes: 
     p.start() 

    processes[1].join() 
    scores_queue.join() 

오류입니다 : 여기

코드입니다 (250,000 번 이상 쓸 필요가 있기 때문에 글쓰기 당 2 초를 낭비 할 수는 없지만). 쓰기 예외를 포착하고 결함이있는 배열을 대기열에 넣으면 스크립트가 멈추지 않습니다 (아마도).

CentOS (2.6.32-279.11.1.el6.x86_64)를 사용하고 있습니다. 어떤 통찰력?

고마워요.

답변

1

다중 처리 모듈을 HDF5와 함께 사용하는 경우 큰 제한은 fork()가 호출 될 때 파일을 열 수 없으며 (읽기 전용 일 수도 없음) 유일한 제한 사항입니다. 다시 말해, 마스터 프로세스에서 파일을 작성하여 작성한 다음 파이썬이 계산을 위해 서브 프로세스를 돌리면 문제가 발생할 수 있습니다. 그것은 fork()가 작동하는 방식과 HDF5 자체가 파일 디스크립터를 다루는 방법을 만드는 것과 관련이 있습니다.

글쓰기를 위해 마스터 파일을 열기 전에 풀 (Pool)을 만드는 등 응용 프로그램을 다시 확인하는 것이 좋습니다.

+0

조언 해 주셔서 감사합니다. 내 요청을 파이썬 코드로 업데이트했습니다. 제발 좀 봐 주시겠습니까? – filannim

+0

음 ... 나는 생산자와 소비자 프로세스가 HDF5를 어떤 식 으로든 만지지 않는다고 가정합니까? –

+0

네, 맞습니다. 이전 버전의 hdf5 아카이브를 복원하면 (과거의 실험에서는 사용되지 않음) 모든 것이 잘된 것으로 나타났습니다. 운영 체제와 관련된 것으로 보입니다. 그럴 수 있니? – filannim