문제

X, Y, 채널, Z, 시간 단계 (x, y, channels, z, time-states)가있는 배열이 있습니다. 그러나 원시 데이터는 Z * 시간 단계 프레임으로 (x, y, 채널)의 단일 스택으로 TIFF 이미지에 저장됩니다.

마지막으로, 베개의 image.getData () 함수는 재구성 해야하는 1D 어레이와 유사한 객체를 리턴합니다.

데이터 집합이 너무 커서 메모리에 맞게 너무 커서 이것을 HDF5로 읽는 가장 좋은 방법은 무엇입니까? HDF5에 쓰여지거나 배열을 작성한 방식으로 1D 데이터를 작성하는 경우 배열을 재구성 할 수 있습니다 (예 : X와 가장 빨리, y 두 번째 가장 빠르게 등) 업데이트 : numpy.ndarray.flat < / a> 이상적 일 것입니다.

여기에서 시도한 것입니다 (img는 pil.image, dset은 h5py dataset입니다) :

1) 개별 프레임을 읽습니다. 이 방법은 1000 프레임에서 300MB에 대해 ~ 20min이 걸리기 때문에이 방법이 너무 느립니다. 대부분의 시간은 dset []= 호출에 소비됩니다.

for i in range(0, img_layers):
  img.seek(i)
  a = numpy.array(img.getdata(), dtype=dtype) # a.shape = (sx * sz * channels,)
  a.resize(sx, sy, channels)
  z = i % sz
  frame = i // sz
  dset[..., z, frame] = a
.

2) 불완전한 : 덩어리에서 읽는 것. 이것은 훨씬 빠르지 만 (동일한 데이터 세트의 경우 2 분)이지만 4D 이미지 (SX, SY, 채널, 시간 단계)에서만이 작업을 수행하고 z-SLICE에 대한 추가 차원이 필요합니다.

chunk_bits = 256 * 1000**2 # 256MB
frame_bits = depth_bits[dtype] * sx * sy * channels
chunk_frames = chunk_bits // frame_bits
a = numpy.zeros((sx, sy, channels, chunk_frames), dtype=dtype)
for i in range(0, layers):
  img.seek(i)
  temp = numpy.array(img.getdata(), dtype=dtype)
  temp.resize(sx, sy, channels)
  a[..., i % chunk_frames] = temp
  if (i + 1) % chunk_frames == 0 or i == (layers - 1):
    chunk = i // chunk_frames
    dset[..., chunk * chunk_frames : i + 1] = a[..., : i % chunk_frames + 1
.

도움이 되었습니까?

해결책

옵션 1이 정답이었습니다.그러나 차이가 가장 빨리 변하는 경우 큰 차이를 만듭니다.

~ 15 분 :

for i in range(0, img_layers):
  img.seek(i)
  a = numpy.array(img.getdata(), dtype=dtype)
  a.resize(sx, sy, channels)
  z = i % sz
  frame = i // sz
  dset[..., z, frame] = a # Majority of time in this call
.

~ 3 분 :

for i in range(0, img_layers):
  img.seek(i)
  a = numpy.array(img.getdata(), dtype=dtype) # Majority of time in this call
  a.resize(sx, sy, channels)
  z = i % sz
  frame = i // sz
  dset[frame, z, ...] = a
.

이 데이터를 신속하게 읽으려면 가장 빠른 다양한 인덱스가 먼저가 아니라 마지막이어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top