큰 (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)를 사용하고 있습니다. 어떤 통찰력?
고마워요.
조언 해 주셔서 감사합니다. 내 요청을 파이썬 코드로 업데이트했습니다. 제발 좀 봐 주시겠습니까? – filannim
음 ... 나는 생산자와 소비자 프로세스가 HDF5를 어떤 식 으로든 만지지 않는다고 가정합니까? –
네, 맞습니다. 이전 버전의 hdf5 아카이브를 복원하면 (과거의 실험에서는 사용되지 않음) 모든 것이 잘된 것으로 나타났습니다. 운영 체제와 관련된 것으로 보입니다. 그럴 수 있니? – filannim