gpt4 book ai didi

Python:通过大文件迭代它的最快方法

转载 作者:行者123 更新时间:2023-11-28 20:29:28 25 4
gpt4 key购买 nike

是的,我正在遍历一个大的二进制文件

我需要最小化这个循环的时间:

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)])

这会获取有关即将到来的数据 block 的所有信息,并很好地将我们置于文件中的正确位置(数据 block 的开始!)。

在这个数据 block 中有:每 channel 4096 个样本,每个接收器 4 个 channel ,9 个接收器。

因此 num_receivers、num_channels、num_samples 将始终相同(无论如何在此刻),但如您所见,这是相当大的数据量。每个“样本”都是一对 int16 值,我想找到它们的大小(因此毕达哥拉斯)。

此 NB2 代码针对文件中的每个“ block ”执行,对于一个 12GB 的文件(这是它们的大小)大约有 20,900 个 block ,我必须遍历其中的 1000 个文件(因此,整体 12TB)。任何速度优势,即使是几毫秒,都会受到极大的赞赏。

编辑:实际上,了解我如何在文件中四处移动可能会有所帮助。我有一个功能如下:

def navigateTo(self, blockNum, indexNum):
ReadFile.fid.seek(ReadFile.fileIndex[blockNum][indexNum],0)
ReadFile.currentBlock = blockNum
ReadFile.index = indexNum

在我运行所有这些代码之前,我扫描文件并在我使用此函数浏览的 ReadFile.fileIndex 中创建一个索引位置列表,然后“搜索”到绝对位置 - 这是否有效?

干杯

最佳答案

因为你在阅读头部后就知道了一个 block 的长度,所以一次读取整个 block 。然后 reshape 数组(非常快,只影响元数据)并使用 np.hypot ufunc:

blockData = np.fromfile(ReadFile.fid, np.int16, num_receivers*num_channels*num_samples*2)
blockData = blockData.reshape((num_receivers, num_channes, num_samples, 2))
return np.hypot(blockData[:,:,:,0], blockData[:,:,:,1])

在我的机器上,它每 block 运行 11 毫秒。

关于Python:通过大文件迭代它的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2319928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com