Использование класса сканера для анализа файла, но для его запуска требуется слишком много времени - PullRequest
0 голосов
/ 24 августа 2011

У меня есть файл, содержащий около 39000 дюймов, разделенных запятыми, по 13 дюймов в каждой строке, поэтому я настроил средство чтения файлов и сканер, чтобы читать и анализировать его, однако для его запуска требуется более часа.Я думаю, что мне, вероятно, нужно использовать bufferedreader, но не уверен, как это реализовать.Кто-нибудь может предложить лучший (более быстрый) способ сделать это?

Вот мой код:

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;

}
}

РЕДАКТИРОВАТЬ:

Я полностью удалил класс сканера, и онотлично работает со следующим кодом:

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;

}

}

1 Ответ

1 голос
/ 24 августа 2011

Вы уверены, что ваша задержка исходит от сканера, а не от заключительного цикла setSignal, который вы вставили?

Я бы порекомендовал использовать TraceView , чтобы выяснить, где именно висит ваша программавверх.Мне очень помогло с подобной проблемой.

Дайте мне знать, если это поможет.Я предлагаю поставить начальную и конечную точки в начале и конце первого цикла.Например:

открытый класс ECGFilereader {// читает файлы ecg с SD-карты

public final static int numChannels = 12;// данные хранятся в 12 каналах, по одному для каждого отведения public final static int numSamples = 3000;// 500 = fs так * 6 в течение 6 секунд данных private File file;частный сканер сканер;short [] [] ecg = new short [numChannels] [numSamples];// Создает краткий файл с именем ecg, в котором будут храниться все выборки для каждого отведения канала

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;
}

Таким образом, у вас будет 2 файла traceView для анализа, чтобы увидеть, откуда возникают проблемы с производительностью.

РЕДАКТИРОВАТЬ:

Еще одна вещь, которую вы должны убедиться, что вы делаете, это проверить, доступно ли внешнее хранилище.Сделайте это с помощью следующего кода:

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;
}
...