Bonjour
J'ai besoin de lire des fichiers binaires qui contiennent le contenu de petites mémoires dans des systèmes d'enregistrement electroniques. La taille de ces fichiers est donc de max la taille des mémoires soit 256Mo.
Je dois traiter ces données en partant du début du fichier et en avant byte par byte (ou plus, pour lire des int32 ou doubles si je suis sur une trame de donnée) et mon problème est que ca prend une infinité de temps, plusieurs minutes sur un i7 récent, un temps insoutenable sur des plus petites machines.
Ci dessous un des codes que j'ai fait, un des plus simple puisqu'il ne fait que tester le contenu d'un fichier de test contenant 0 1 2 3.....252 253 254 0 1 2 3....
Comment puis je m'y prendre pour lire mes fichiers autrement ? Une manière radicalement différente qui me permettrait d'aller infiniment plus vite ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 private void btTesterFichierTest_Click(object sender, EventArgs e) { richTextBox2.Clear(); long i = 0; const string fileName = "toto2.dav"; if (!File.Exists(fileName)) { MessageBox.Show("Le fichier n'existe pas encore. Il faut lire la mémoire en HighPSeed"); } else { using (BinaryReader MonReader = new BinaryReader(File.Open(fileName, FileMode.Open))) { MonReader.BaseStream.Position = 0; int ReferenceTest = 0; int comptageAdresseReelleMemoireFlash = 0; bool stop = false; while (MonReader.BaseStream.Position < MonReader.BaseStream.Length && stop == false) { if (comptageAdresseReelleMemoireFlash < 2048) { int valeur = MonReader.ReadByte(); if (valeur != ReferenceTest) { stop = true; StatusProgressTextColor(100, System.Drawing.Color.LimeGreen, "TestFichier. Pos : " + (MonReader.BaseStream.Position - 1).ToString() + " ValeurAttendue :" + ReferenceTest.ToString() + " Valeur :" + valeur.ToString() + " \r\n"); } } ReferenceTest +=1; comptageAdresseReelleMemoireFlash += 1; if (ReferenceTest == 255) ReferenceTest = 0; if (comptageAdresseReelleMemoireFlash == 2112) comptageAdresseReelleMemoireFlash = 0; } }
Je me demandais si charger le tableau en ram serait plus rapide ? avec une crainte sur l'alignement en mémoire qui ferait que mes 256Mo prendrait 8fois plus de place sur une machine 64bit et peut être pas la même efficacité pour lire le flux (pas de readbyte, readdouble, readInt32...)
Merci par avance pour vos conseils
Partager