Migliorare le prestazioni di un processo di importazione in formato db

3

Ho un programma in Microsoft Access che elabora il testo e inserisce anche dati nel database MySQL. Questa operazione richiede 30 minuti o meno per terminare.

L'ho tradotto in VB.NET e ci vogliono 2 ore per terminare.

Il programma funziona così:

  1. Un file di testo contiene singoli passaggi da una persona corrispondente, contiene il loro id, l'ora e la data di scorrimento nella macchina, e un indicatore se è un time-in o un time-out.
  2. Elaboro questo testo, segrego le informazioni e inserisco il time-in e il time-out per riga.
  3. Controllo anche se ci sono doppie occorrenze nel database.
  4. Dopo aver controllato, semplicemente unisco l'ora e il timeout della persona corrispondente in una sola riga.

Questo processo richiede 2 ore per terminare in VB.NET considerando che ho una tabella per confrontare che contiene più di 600.000 righe.

Ora, ho letto su Internet che Python è il migliore nell'elaborazione del testo, ho già un test ma dubito nel funzionamento del database.

Quale pensi che sia il miglior linguaggio di programmazione per questo tipo di problema?

Come posso accelerare il processo? La mia prima idea era usare python al posto di VB.NET, ma dal momento che le persone qui mi dicono qui su PSE che questo probabilmente non aiuterà, sto cercando soluzioni diverse.

Ecco un collegamento al test che ho fatto.

    
posta mmr 05.11.2013 - 07:57
fonte

2 risposte

3

Trovo molto improbabile che la modifica del linguaggio di programmazione ti porti oltre. Quindi applica la regola più alta di ottimizzazione delle prestazioni:

Trova il collo di bottiglia misurando il tempo di esecuzione per i singoli passaggi! .

Può trattarsi dell'elaborazione del testo, delle operazioni del DB o di entrambi. Non ci hai mostrato alcun codice, ma in situazioni come questa le operazioni di DB sarebbero state le prime a sospettarmi.

Ad esempio, puoi considerare di commentare le operazioni del DB, lasciare solo l'elaborazione del testo attiva e quindi misurare e confrontare i tempi di esecuzione.

    
risposta data 05.11.2013 - 08:19
fonte
0

Sono d'accordo con Doc Brown sul fatto che dovresti prima cercare di trovare il collo di bottiglia nella tua applicazione, altrimenti saremo tutti solo a fare ipotesi e non ci sarà alcun reale utilizzo. Qualsiasi cosa potrebbe essere sospetta.

La prima cosa che potresti fare è misurare la durata di:

  • l'intero processo, consistente nella lettura di una riga nel file, controllo dei duplicati, inserimento di una riga
  • l'intero processo di nuovo, ma quando hai trovato un duplicato e come tale, quando non stai inserendo una linea

Inoltre, si prega di prendere misure di singole operazioni. Quanto tempo ci vuole per leggere il file in media? Quanto tempo ci vuole per verificare la presenza di duplicati? Quanto ci vuole per inserire un record? Forse la durata continua a crescere lungo le dimensioni del tavolo?

L'unico modo per rispondere a queste domande è ottenere i numeri.

Infine, penso che ci siano diverse ottimizzazioni a seconda della posizione del collo di bottiglia. Ad esempio, potresti:

  • legge più di 1 riga alla volta, ad esempio 10 e invia l'elaborazione di queste righe a 10 thread separati.
  • più in generale, separare il processo di lettura del file dalla scrittura al database utilizzando il pubblica / sottoscrivi modello.
  • ottimizza gli indici nella tabella del database.
  • invece di controllare ogni volta che non ci sono duplicati, magari memorizzare l'intera tabella in una mappa in memoria prima di iniziare l'elaborazione del file. Questo potrebbe richiedere alcuni secondi (e alcune dimensioni della memoria), ma si evita un giro di andata e ritorno IO per linea.

Per concludere, penso che tu abbia ragione a non cambiare la tua lingua, la langue non è il problema.

    
risposta data 05.11.2013 - 14:54
fonte

Leggi altre domande sui tag