【发布时间】:2011-01-20 04:00:41
【问题描述】:
对,我正在遍历一个大的二进制文件
我需要尽量减少这个循环的时间:
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 代码是针对文件中的每个“块”执行的,对于一个 12GB 的文件(它们有多大),大约有 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 处创建一个索引位置列表,我使用此函数浏览这些位置,然后“寻找”到绝对位置 - 这效率高吗?
干杯
【问题讨论】:
标签: python binary numpy iteration