Ceci est très étrangeLa lecture d'un fichier binaire en Python: prend beaucoup de temps pour lire certains octets
Je lis un peu (il est vrai très grand: ~ 2 Go chacun) des fichiers binaires à l'aide des bibliothèques numpy en Python. J'utilise le:
thingy = np.fromfile(fileObject, np.int16, 1)
méthode. Ceci est juste au milieu d'une boucle imbriquée - je fais cette boucle 4096 fois par 'canal', et cette boucle 'canal' 9 fois pour chaque 'récepteur', et cette boucle 'récepteur' 4 fois (il y a 9 canaux par récepteur, dont il y a 4!). C'est pour chaque "bloc", dont il y a ~ 3600 par fichier.
Donc, vous pouvez voir, très itératif et je sais que cela prendra du temps, mais cela prenait BEAUCOUP plus de temps que prévu - en moyenne 8,5 secondes par 'bloc'. J'ai exécuté quelques tests en utilisant time.clock() etc. et j'ai trouvé que tout fonctionnait aussi vite qu'il le devrait, sauf pour environ 1 ou 2 échantillons par 'block' (donc 1 ou 2 en 4096 * 9 * 4) où il semblerait être «coincé» pendant quelques secondes. Maintenant, cela devrait être un cas de retourner un simple int16 de binaire, pas exactement quelque chose qui devrait prendre quelques secondes ... pourquoi est-il coller? De l'analyse comparative, j'ai trouvé qu'il collait au même endroit à chaque fois, (bloc 2, récepteur 8, canal 3, échantillon 1085 était l'un d'entre eux, pour l'enregistrement!), Et il serait coincé là pour environ la même quantité de temps chaque course.
Des idées ?!
Merci,
Duncan
Comptage à partir de 0 Je présume? –
Oui, donc les récepteurs 0-3, les canaux 0-7, les échantillons 0-4095 –
Le problème avec quelque chose comme 'fromfile()' est qu'il ne peut pas savoir à l'avance combien d'espace allouer, donc avec des fichiers vraiment volumineux vous pourrait être vissé. Voir ma réponse et certains des commentaires suivants dans http://stackoverflow.com/questions/1896674/python-how-to-read-huge-text-file-into-memory pour des idées possibles sur la façon de gérer cela, et la problème sous-jacent. –