Bon, je suis en train d'itérer à travers un grand fichier binaire.
Je dois minimiser le temps de cette boucle :
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
Donc, ce qui se passe est le suivant : r1 est l'en-tête du fichier, dTypes.NB_HDR est un type que j'ai créé :
NB_HDR= np.dtype([('f3',np.uint32),('f4',np.uint32),('f5',np.uint32),('f6',np.int32),('f7',np.int32),('f8',np.uint32)])
Cela permet d'obtenir toutes les informations sur le bloc de données à venir, et nous place joliment à la bonne position dans le fichier (le début du bloc de données !).
Dans ce bloc de données, il y a : 4096 échantillons par canal, 4 canaux par récepteur, 9 récepteurs.
Donc num_receivers, num_channels, num_samples seront toujours les mêmes (pour le moment en tout cas), mais comme vous pouvez le voir, c'est une quantité assez importante de données. Chaque 'échantillon' est une paire de valeurs int16 dont je veux trouver la magnitude (d'où Pythagore).
Ce code NB2 est exécuté pour chaque "bloc" du fichier. Pour un fichier de 12 Go (c'est leur taille), il y a environ 20 900 blocs, et je dois itérer sur 1000 de ces fichiers (soit 12 To au total). Tout gain de vitesse, ne serait-ce qu'en millisecondes, serait très apprécié.
EDIT : En fait, cela pourrait être utile de savoir comment je me déplace dans le fichier. J'ai une fonction comme suit :
def navigateTo(self, blockNum, indexNum):
ReadFile.fid.seek(ReadFile.fileIndex[blockNum][indexNum],0)
ReadFile.currentBlock = blockNum
ReadFile.index = indexNum
Avant d'exécuter tout ce code, j'analyse le fichier et je dresse une liste d'emplacements d'index dans ReadFile.fileIndex que je parcours à l'aide de cette fonction, puis je cherche l'emplacement absolu - est-ce efficace ?
Cheers