Ottimizzazione dell'algoritmo di registrazione

0

Ho creato un semplice algoritmo che rende i miei log più adatti per essere tracciati. Un file di registro ha la seguente struttura:

timestamp bytes

e assomiglia a questo:

1485762953167032 517
1485762953167657 517
1485762953188416 517
1485762953188504 517
1485762953195641 151
1485762953196256 151
1485762953198736 216
1485762953200099 216
1485762953201115 1261
1485762953201658 151
1485762953201840 151
1485762953202040 1261
1485762953203387 216
1485762953204183 216
1485762953206935 549
1485762953207548 546
1485762953259335 306
1485762953260025 1448
1485762953260576 1448
1485762953261087 1448
1485762953261790 1500
1485762953263878 1500
1485762953264273 1448
1485762953264914 1500

Ottengo il mio timestamp con gettimeofday(&t, NULL) e raggiungo un long long timestamp = (t.tv_sec * 1000000) + t.tv_usec preciso.

Quando ho detto prima "rende i miei registri più adatti" intendevo "il timestamp dovrebbe essere impostato su secondi di precisione, non su microsecondi", quindi entrambe le colonne saranno modificate.

Il mio algoritmo ingenuo è qualcosa di simile (è in Bash e dal momento che forse non piace a tutti, hai il suo pseudocodice): pronto ogni riga del file di log, trasforma il timestamp da microsecondi a secondi dividendo un milione, se è il lo stesso timestamp trasformato di quello della riga precedente, aggiorna il conteggio di byte e pacchetti (un pacchetto per riga).

for every file.log {
    TIMESTAMP=0
    BYTES=0
    PACKETS=0

    echo "Creating file $LOGFILE.plt..."
    create file $LOGFILE.plt

    echo "Preparing $LOGFILE for plotting..."

    while read file.log LINE {
        # LINE is a array: LINE[0] contains timestamp, LINE[1] contains bytes
        if PACKETS == 0 {
            # first row
            TIMESTAMP = LINE[0] / 1000000
            BYTES = BYTES + LINE[1]
            PACKETS += 1
            echo TIMESTAMP " " BYTES " " PACKETS
        }

        TEMP_TIMESTAMP = LINE[0] / 1000000

        if TIMESTAMP == TEMP_TIMESTAMP {
            BYTES = BYTES + LINE[1]
            PACKETS += 1
        }
        else {
            if PACKETS != 0 {
                log in file "TIMESTAMP BYTES PACKETS" >> $LOGFILE.plt
            }
            TIMESTAMP = TEMP_TIMESTAMP
            BYTES=0
            PACKETS=1
        }
    }
}

Poiché legge ogni riga del file di log è almeno O (n) e per un lungo file di log potrebbe volerci un po 'di tempo: c'è un modo per ridurre questa volta?

Non riesco a fare questa ottimizzazione nel mio codice: è un programma basato su prestazioni in tempo reale (ad esempio streaming e altri servizi di risposta), quindi deve fare il minimo sforzo possibile; già registra, non è in grado di calcolare le cose di ottimizzazione anche sui log.

    
posta elmazzun 30.01.2017 - 10:07
fonte

2 risposte

1

awk sembra costruito appositamente per attività del genere.

cat input_file | awk '{print int($1/1000000 + 0.5), $2}' > temp_file

Ora temp_file contiene quantità di pacchetti al secondo, con molti valori di secondi duplicati.

Per unire i valori, puoi reindirizzarli attraverso questa chiamata:

awk 'BEGIN {tstamp = 0; bytes = 0}; 
     {if ($1 == tstamp) {bytes += $2} 
      else {if (tstamp != 0) {print tstamp, bytes}; 
            tstamp=$1; bytes = $2}}'

Metterei questi due script awk nei file e usare qualcosa come

cat input_file | awk -f divide.awk | awk -f coalesce.awk > output_file 
    
risposta data 01.03.2017 - 17:32
fonte
0

Non seguire il tuo pseudocodice ma

Altrimenti non vedo come i pacchetti potrebbero mai essere zero e l'impostazione BYTES = 0 è sbagliata

Non riesci a scrivere l'ultimo

read file.log LINE 
TIMESTAMP = LINE[0] / 1000000
BYTES = LINE[1]
PACKETS = 1
echo TIMESTAMP " " BYTES " " PACKETS

while read file.log LINE {
    # LINE is a array: LINE[0] contains timestamp, LINE[1] contains bytes

    TEMP_TIMESTAMP = LINE[0] / 1000000

    if TIMESTAMP == TEMP_TIMESTAMP {
        BYTES += LINE[1]
        PACKETS += 1
    }
    else {
        log in file "TIMESTAMP BYTES PACKETS" >> $LOGFILE.plt
        TIMESTAMP = TEMP_TIMESTAMP
        BYTES = LINE[1]
        PACKETS = 1
    }
}
log in file "TIMESTAMP BYTES PACKETS" >> $LOGFILE.plt 
    
risposta data 30.01.2017 - 16:41
fonte

Leggi altre domande sui tag