Да, я перебираю большой двоичный файл
Мне нужно минимизировать время этого цикла:
def NB2(self, ID_LEN):
r1=np.fromfile(ReadFile.fid,dTypes.NB_HDR,1)
num_receivers=r1[0][0]
num_channels=r1[0][1]
num_samples=r1[0][5]
blockReturn = np.zeros((num_samples,num_receivers,num_channels))
for rec in range(0,num_receivers):
for chl in range(0,num_channels):
for smpl in range(0,num_samples):
r2_iq=np.fromfile(ReadFile.fid,np.int16,2)
blockReturn[smpl,rec,chl] = np.sqrt(math.fabs(r2_iq[0])*math.fabs(r2_iq[0]) + math.fabs(r2_iq[1])*math.fabs(r2_iq[1]))
return blockReturn
Итак, что происходит следующим образом:
r1 - заголовок файла, dTypes.NB_HDR - тип, который я сделал:
NB_HDR= np.dtype([('f3',np.uint32),('f4',np.uint32),('f5',np.uint32),('f6',np.int32),('f7',np.int32),('f8',np.uint32)])
Это получает всю информацию о предстоящем блоке данных и приятно помещает нас в правильную позицию в файле (начало блока данных!).
В этом блоке данных есть:
4096 выборок на канал,
4 канала на приемник,
9 приемников.
Так что num_receivers, num_channels, num_samples всегда будут одинаковыми (в любом случае на данный момент), но, как вы можете видеть, это довольно большой объем данных. Каждый «образец» представляет собой пару значений int16, для которых я хочу найти величину (отсюда и Пифагора).
Этот код NB2 выполняется для каждого «Блока» в файле, для файла размером 12 ГБ (который имеет большой размер) существует около 20 900 блоков, и мне нужно перебрать 1000 таких файлов (так что 12TB в целом). Любое преимущество в скорости, даже если это миллисекунды, будет очень цениться.
РЕДАКТИРОВАТЬ: На самом деле это может быть полезно знать, как я перемещаюсь внутри файла. У меня есть функция следующим образом:
def navigateTo(self, blockNum, indexNum):
ReadFile.fid.seek(ReadFile.fileIndex[blockNum][indexNum],0)
ReadFile.currentBlock = blockNum
ReadFile.index = indexNum
Прежде чем запустить весь этот код, я сканирую файл и создаю список местоположений индексов на ReadFile.fileIndex, которые я просматриваю с помощью этой функции, а затем «ищу» абсолютное местоположение - это эффективно?
Приветствия