Права, я перебор большого двоичного файлPython: Самый быстрый способ итерации это через большой файл
мне нужно, чтобы минимизировать время этого цикла:
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, которые я хочу найти величиной (следовательно, Pythagoras).
Этот код NB2 выполняется для каждого «Блока» в файле, для 12-гигабайтного файла (насколько он велик) имеется около 20 900 блоков, и мне нужно пройти через 1000 из этих файлов (так , 12 ТБ в целом). Любое преимущество в скорости, даже если это миллисекунды, будет широко оценено.
EDIT: На самом деле может быть полезно знать, как я перемещаюсь внутри файла. У меня есть функция следующим образом:
def navigateTo(self, blockNum, indexNum):
ReadFile.fid.seek(ReadFile.fileIndex[blockNum][indexNum],0)
ReadFile.currentBlock = blockNum
ReadFile.index = indexNum
Перед тем, как запустить весь этот код я просканировать файл и список местоположений индексов в ReadFile.fileIndex просматриваемых с помощью этой функции, а затем «стремятся» к абсолютному месту - Это эффективно?
Приветствие
Это удивительное решение, если у вас достаточно памяти для одновременного загрузки всех каналов приемника в память. –
Удивительно, буквально, спасибо! Выполнение этого в течение 10 мс на блок, то есть в 10 раз улучшение! –