0

J'ai un fichier contenant environ 39000 ints séparé par des virgules avec 13 ints sur chaque ligne donc j'ai mis en place un lecteur de fichiers et un scanner pour lire et analyser Cependant, il prend littéralement plus d'une heure à courir. Je pense que j'ai probablement besoin d'utiliser un lecteur buffered mais je ne sais pas comment l'implémenter. Quelqu'un peut-il suggérer une meilleure façon (plus rapide) de faire cela?Utilisation de la classe scanner pour analyser un fichier mais il faut beaucoup trop de temps pour exécuter

Voici mon code:

public class ECGFilereader { // reads the ecg files from the SD card 

public final static int numChannels = 12; // the data is stored in 12 channels, one for each lead 
public final static int numSamples = 3000; //500 = fs so *6 for 6 seconds of data 
private File file; 
private Scanner scanner; 
short [] [] ecg = new short [numChannels] [numSamples]; //Creates a short called ecg in which all of the samples for each channel lead will be stored 

public ECGFilereader (String fname) throws FileNotFoundException 
{ 
    file = new File(Environment.getExternalStorageDirectory() +"/1009856.txt");  //accesses the ecg file from the SD card 

    scanner = new Scanner(file); 

    scanner.useDelimiter(",|\\r\\n"); //sets commas and end's of lines as separators between each int 
} 

public boolean ReadFile(Waveform[] waves) // sorts data into and array of an array (12 channels each containing 3000 samples) 
{ 
    for (int sample=0; sample<numSamples && scanner.hasNextInt(); sample++)  // 
    { 
     scanner.nextInt(); 
     for (int chan = 0; chan<numChannels; chan++) 
     { 
      if(scanner.hasNextInt()) 
       ecg [chan] [sample] = (short) scanner.nextInt();   

      else if (scanner.hasNextLine()) 
      { scanner.nextLine(); 
      } 
      else return false; 
     } 
    } 
    for (int chan=0; chan<numChannels; chan++) 
     waves[chan].setSignal(ecg[chan]); // sets a signal equal to the ecg array of samples for each channel 
    return true; 

} 
} 

EDIT:

Je suis maintenant retiré de la classe du scanner complètement et il fonctionne parfaitement avec le code suivant:

public boolean ReadFile(Waveform[] waves) // sorts data into and array of an array (12 channels each containing 3000 samples) 
{ 
try { 
    BufferedReader in = new BufferedReader(new FileReader(file)); 

    String reader = ""; 
    for (int sample=0; sample<numSamples; sample++){ 
    if ((reader = in.readLine()) == null) { 
     break;} 
    else { 
     String[] RowData = reader.split(","); // sets the commas as separators for each int. 
     for (int chan=0; chan <12 && chan<RowData.length; chan++) 
      ecg [chan][sample]= Integer.parseInt(RowData[chan+1]); //parses each int from the current row into each channel for the ecg[] 
     } 
    } 
    in.close(); 
} catch (IOException e) { 
    } 
    for (int chan=0; chan<numChannels; chan++) 
     waves[chan].setSignal(ecg[chan]); // sets a signal equal to the ECG array of samples for each channel 
    return true; 

} 

}

Répondre

1

Etes-vous sûr que votre retard provient du scanner et non du set final? op vous avez mis?

Je vous recommande d'utiliser TraceView pour savoir exactement où votre programme est suspendu. Cela m'a beaucoup aidé avec un problème similaire. Faites-moi savoir si cela aide.

Je suggère de placer les points de départ et d'arrêt au début et à la fin de la première boucle. Comme ceci:

ECGFilereader public class {// lit les fichiers de la carte ecg SD

public static final int numChannels = 12; // les données sont stockées dans 12 canaux, un pour chaque piste public final static int numSamples = 3000; // 500 = fs so * 6 pour 6 secondes de données privé Fichier fichier; scanner scanner privé; court [] [] ecg = nouveau court [numChannels] [numSamples]; // Crée un court appelé ecg dans lequel tous les échantillons pour chaque fil du canal sera stocké

public boolean ReadFile(Waveform[] waves) // sorts data into and array of an array (12 
channels each containing 3000 samples) 
{ 
Debug.startMethodTracing("scanner"); 
for (int sample=0; sample<numSamples && scanner.hasNextInt(); sample++)  // 
{ 
    scanner.nextInt(); 
    for (int chan = 0; chan<numChannels; chan++) 
    { 
     if(scanner.hasNextInt()) 
      ecg [chan] [sample] = (short) scanner.nextInt();   

     else if (scanner.hasNextLine()) 
      scanner.nextLine(); 

     else return false; 
    } 
} 
Debug.stopMethodTracing(); 

Debug.startMethodTracing("setSignal"); 
for (int chan=0; chan<numChannels; chan++) 
    waves[chan].setSignal(ecg[chan]); 
    // sets a signal equal to the ecg array of samples for each channel 
Debug.stopMethodTracing(); 
return true; 
} 

De cette façon, vous aurez 2 fichiers TraceView d'analyser pour voir où vos problèmes de performance viennent.

EDIT:

Une autre chose que vous devez vous assurer que vous faites est de vérifier si le stockage externe est disponible. Faites-le avec le code suivant:

boolean mExternalStorageAvailable = false; 
boolean mExternalStorageWriteable = false; 
String state = Environment.getExternalStorageState(); 

if (Environment.MEDIA_MOUNTED.equals(state)) { 
    // We can read and write the media 
    mExternalStorageAvailable = mExternalStorageWriteable = true; 
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
    // We can only read the media 
    mExternalStorageAvailable = true; 
    mExternalStorageWriteable = false; 
} else { 
    // Something else is wrong. It may be one of many other states, but all we need 
    // to know is we can neither read nor write 
    mExternalStorageAvailable = mExternalStorageWriteable = false; 
} 
+0

Merci pour l'aide, je vais regarder dans TraveView pour référence future. Pour cela, j'ai complètement remplacé la classe scanner et je l'ai fait fonctionner à la fin avec l'aide d'un ami. Je posterai ce que j'ai fait comme réponse imminente. Merci aussi pour la suggestion sur la vérification de la carte SD est disponible. – Jacko85

+0

Pas de problème! Je suis content que vous ayez votre code de travail. BufferedReader est ce qui est généralement recommandé d'utiliser dans la plupart des cas, de toute façon. N'oubliez pas de marquer une réponse comme correcte si elle a résolu votre problème! Bienvenue à SO et bon codage :) – Codeman

Questions connexes