C'è una stringa di 1 gigabyte di dati arbitrari, che si può presumere di essere equivalente a qualcosa come:modo più veloce per cercare 1GB + una stringa di dati per la prima occorrenza di un modello in Python
1_gb_string=os.urandom(1*gigabyte)
Saremo cercando questa stringa, 1_gb_string
, per un numero infinito di larghezza fissa, modelli 1 kilobyte, 1_kb_pattern
. Ogni volta che cerchiamo il modello sarà diverso. Quindi le opportunità di caching non sono evidenti. La stessa stringa da 1 gigabyte verrà ricercata più e più volte. Ecco un semplice generatore per descrivere cosa sta succedendo:
def findit(1_gb_string):
1_kb_pattern=get_next_pattern()
yield 1_gb_string.find(1_kb_pattern)
Si noti che deve essere trovata solo la prima occorrenza del modello. Dopodiché, non dovrebbe essere eseguita alcuna altra elaborazione importante.
Cosa posso usare che è più veloce di trovare Python bultin per la corrispondenza 1KB modelli contro 1 GB o più stringhe di dati?
(io sono già a conoscenza di come dividere la stringa e la ricerca in parallelo, in modo da poter ignorare che l'ottimizzazione di base.)
Aggiornamento: Si prega di bound requisiti di memoria a 16 GB.
È probabile che la stringa 1_gb_stringa cambi? –
Non sembra così, ma stai solo cercando lungo i pezzi a larghezza fissa? Come in, se fossero byte e megabyte invece di kilobyte e gigabyte, sarebbe una stringa che contiene i seguenti due byte: "49FA 32D1" corrisponde al modello a 1 byte di "FA32"? –
> È probabile che 1_gb_string cambi? No, rimane lo stesso durante tutte le corse. > stai solo cercando lungo i blocchi di larghezza fissa? Purtroppo no. – user213060