Come selezionare ogni x% di record per l'elaborazione

2

Sto elaborando un flusso di record in arrivo, per chiarezza presumo che siano numerati in sequenza 1,2,3 .... ecc.

La maggior parte delle volte i record arrivano abbastanza lentamente da consentirmi di elaborare ogni singolo record. Durante i periodi di punta, arrivano troppo velocemente per essere elaborati, quindi devo eliminare / ignorarne una parte.

Ho usato un semplice bit di codice (pseudo) come questo .....

if ( n mod x == 0 )
{
  process = true;
}

(dove 'n' è il numero del record). Questo è piuttosto semplice, se 'x' è 2 e il record è pari numerato viene elaborato, se è dispari numerato viene ignorato. Il 50% dei record viene elaborato e il 50% ignorato. Se sostituisco 'x' con 10, verrà elaborato un record in 10 (cioè il 10%) e il 90% verrà ignorato. Sostituendo 'x' con 20 selezioni il 5% dei record.

Funziona bene, ma consente solo la selezione di un numero limitato di percentuali ..

x=2  -> 50%
x=3  -> 33%
x=4  -> 25%
x=5  -> 20%

Come posso riscrivere il mio codice per selezionare una determinata percentuale di record in entrata, ad esempio l'85%?

sebbene lo stia facendo con uno script PowerShell, sto cercando una soluzione neutra per la lingua.

AGGIORNAMENTO - A causa della natura dei dati, preferirei non lasciare cadere i record casualmente perché ciò potrebbe (in teoria) eliminare una lunga sequenza di record consecutivi. Preferirei abbandonare / elaborare a una frequenza regolare, cioè elaborare 3 record, rilasciare 1 e ripetere. Lasciare cadere (diciamo) 20 record di seguito potrebbe farmi perdere qualcosa di importante.

    
posta Hemel 13.05.2018 - 14:58
fonte

1 risposta

5

Il modo semplice per gestirlo è qualcosa come if (rand() < targetFraction) process = true . Formalmente, questo non ti garantisce l'85% o qualsiasi altra cosa, ma si avvicina asintoticamente all'85% man mano che aumenta il numero di record.

Nota che penso che potresti risolvere il problema sbagliato qui - se sai che puoi gestire al massimo N record al secondo, scrivi un codice che cade qualsiasi valore al di sopra di tale percentuale, piuttosto che codificare con precisione una frazione da eliminare.

    
risposta data 13.05.2018 - 15:15
fonte

Leggi altre domande sui tag