Aumenta le prestazioni dell'applicazione [chiusa]

1

Sto scrivendo un programma per un'azienda che genererà un rapporto giornaliero per loro. Tutti i dati che utilizzano per questo report sono archiviati in un database SQLite locale. Per questo report, si utilizza praticamente ogni bit delle informazioni nel database. Pertanto, al momento, quando interrogo il data base, recupero tutto e memorizzo le informazioni negli elenchi. Ecco cosa ho:

using (var dataReader = _connection.Select(query))
{
    if (dataReader.HasRows)
    {
        while (dataReader.Read())
        {
            _date.Add(Convert.ToDateTime(dataReader["date"]));
            _measured.Add(Convert.ToDouble(dataReader["measured_dist"]));
            _bit.Add(Convert.ToDouble(dataReader["bit_loc"]));
            _psi.Add(Convert.ToDouble(dataReader["pump_press"]));
            _time.Add(Convert.ToDateTime(dataReader["timestamp"]));
            _fob.Add(Convert.ToDouble(dataReader["force_on_bit"]));
            _torque.Add(Convert.ToDouble(dataReader["torque"]));
            _rpm.Add(Convert.ToDouble(dataReader["rpm"]));
            _pumpOneSpm.Add(Convert.ToDouble(dataReader["pump_1_strokes_pm"]));
            _pumpTwoSpm.Add(Convert.ToDouble(dataReader["pump_2_strokes_pm"]));
            _pullForce.Add(Convert.ToDouble(dataReader["pull_force"]));
            _gpm.Add(Convert.ToDouble(dataReader["flow"]));
        }
    }
}

Quindi utilizzo questi elenchi per i calcoli. Ovviamente, più informazioni sono presenti in questo database, più lunga sarà la query iniziale. Sono curioso di sapere se esiste un modo per aumentare le prestazioni della query? Grazie per qualsiasi aiuto.

Modifica

Una delle righe del rapporto è chiamata Ore giornaliere di perforazione. Per questo calcolo, utilizzo questo metodo:

// Retrieves the timestamps where measured depth == bit depth and PSI >= 50
public double CalculateDailyProjectDrillingHours(DateTime date)
{
    var dailyTimeStamps = _time.Where((t, i) => _date[i].Equals(date) &&
                                        _measured[i].Equals(_bit[i]) &&
                                        _psi[i] >= 50).ToList();
        return
            _dailyDrillingHours =
            Convert.ToDouble(Math.Round(TimeCalculations(dailyTimeStamps).TotalHours, 2, MidpointRounding.AwayFromZero));
}

// Checks that the interval is less than 10, then adds the interval to the total time
private static TimeSpan TimeCalculations(IList<DateTime> timeStamps)
{
    var interval = new TimeSpan(0, 0, 10);
    var totalTime = new TimeSpan();
    TimeSpan timeDifference;

    for (var j = 0; j < timeStamps.Count - 1; j++)
    {
        if (timeStamps[j + 1].Subtract(timeStamps[j]) <= interval)
        {
            timeDifference = timeStamps[j + 1].Subtract(timeStamps[j]);
            totalTime = totalTime.Add(timeDifference);
        }
    }

    return totalTime;
}
    
posta PiousVenom 23.10.2012 - 21:38
fonte

1 risposta

5

Se capisco cosa stai facendo correttamente, in realtà stai copiando l'intero database in memoria e interrogandolo usando Linq. Questo è estremamente dispendioso dato che ora hai i dati sia nella memoria che nel database stesso. Quello che devi fare per interrogare il database stesso per i dati che ti servono, che è ciò per cui è stato progettato un database. Per questo dovrai imparare SQL. Ad esempio, guarda questa query di Linq:

var dailyTimeStamps = _time.Where((t, i) => _date[i].Equals(date) &&
                                        _measured[i].Equals(_bit[i]) &&
                                        _psi[i] >= 50).ToList();

Stai tirando un elenco di tutti i timestamp solo per filtrarlo in pochi. Tuttavia, utilizzando una query SQL come questa:

SELECT timestamp 
FROM table
WHERE date = @date
AND measured_dist = bit_loc
AND pump_press >= 50

Questo ti fornirà immediatamente un elenco dei timestamp di cui hai bisogno, senza dover caricare tutti i dati in memoria.

    
risposta data 23.10.2012 - 22:13
fonte

Leggi altre domande sui tag