Domanda

Ho alcuni file di dati che vengono scritti come tag = valore, in cui tag è stringa e il valore possono essere di tipo numerico, string, array, ecc ho utilizzare questo formato, perché è leggibile e possono essere modificati facilmente. Ora ogni classe che viene creata un'istanza utilizzando questo formato ha un metodo di carico e legge i tag che ha bisogno e utilizzare i valori trovati all'interno di questi tag. Voglio fare binaria dei dati per aumentare la velocità di caricamento. Un modo potrebbe essere quello di avere un ToBinary (il nome non importa) il metodo in ogni classe che legge i vecchi dati e scrivere in un file e il nuovo file viene utilizzato per creare un'istanza dell'oggetto. Questo può essere fatto in linea, solo una volta / applicazione. Avete altri suggerimenti per questo? Io uso C ++ per questo.

Modifica: Penso che la parte più costosa è ora quello di analizzare il file quando ho letto e dopo che per cercare il tag che ho bisogno, di non leggere il file dal disco. Posso utilizzare il file system personalizzato per avere più file di piccole dimensioni in un unico grande file.

È stato utile?

Soluzione

Ho una classe base serializzazione per questo, con da / funzioni con un piccolo colpo di testa in cui la manipolazione versione può essere incorporato. Credo che il suo sistema una buona per i dati più semplici che devono essere memorizzati localmente e nella maggior parte dei casi è "sola lettura".

Qualcosa di simile a questo:

class SeralizeMe
{
public:

 virtual bool To(Archive &file)=0;
 virtual bool From(Archive &file)=0;

 virtual bool NeedsSave(void)=0;

};

Tuttavia, non utilizzare questo sistema se:

  • ha bisogno di cambiare il formato spesso.
  • ha bisogno di selezionare i dati da caricare e cosa negozio.
  • Utilizzare file di grandi dimensioni, che è particulare sensibile alle interruzioni di corrente, mentre il risparmio.

Se uno qualsiasi di questi casi la riguarda, utilizzare un database, FirebirdSQL incorporato è un concorrente adeguato.

Altri suggerimenti

Non ho usato prima, ma sono sicuro che la serializzazione del Boost modulo è un buon posto per cominciare.

Se si utilizza un file, quindi utilizzando dati binari probabilmente non migliorare le prestazioni in modo significativo, a meno che non si dispone di molto grande blocco di dati da memorizzare nel file (immagini, video ...).

Ma in ogni caso è possibile utilizzare un algoritmo di serializzazione binaria, come quello da Boost .

Un altro è protobuf da google. Non il più veloce, ma è in grado di supportare i tipi di dati in continua evoluzione ed è molto efficiente in rete e supporta altre lingue.

qui .

Se si desidera migliorare le prestazioni, si dovrà utilizzare i campi di lunghezza fissa. campi a lunghezza variabile loading parsing o non fornisce un significativo incremento di prestazioni. Lettura da riga di testo comporta la scansione di fine linea token. Scansione di perdere tempo.

Prima di utilizzare uno qualsiasi dei seguenti suggerimenti, profilo il codice per stabilire un tempo di riferimento o un numero per le prestazioni. Fate questo dopo ogni suggerimento, in quanto vi permetterà di calcolare il delta prestazioni di ogni ottimizzazione. La mia previsione è che il delta diventi più piccolo con ogni ottimizzazione.

suggerisco prima convertire il file di record di lunghezza fissa, sempre utilizzando il testo. campi Pad con spazi se necessario. Così, conoscendo la dimensione di un record, è possibile bloccare letto in memoria e trattare la memoria, come un array. Ciò dovrebbe fornire un miglioramento significativo.

Velocità

A questo punto, i vostri colli di bottiglia sono ancora file di I / O, che non si può davvero migliorare in modo significativo su (perché il file di I / O è controllato dal sistema operativo), e scannning / testo di conversione. Alcuni ulteriori ottimizzazioni sono: il testo convertito in numeri e, infine, la conversione in binario. A tutti i costi, preferiscono mantenere il file di dati in forma leggibile.

Prima di effettuare il file di dati meno leggibili, provare a dividere l'applicazione in thread. Un thread gestisce l'interfaccia grafica, un altro l'ingresso, e un altro per la lavorazione. L'idea è di avere il processore sempre l'esecuzione di alcune del codice piuttosto che aspettare. In piattaforme moderne, file di I / O può essere eseguita mentre la CPU elabora il proprio codice.

Se non si cura di portabilità, vedere se la vostra piattaforma ha capacità di DMA (un componente DMA o Direct Memory Access permette trasferimenti di dati senza utilizzare il processore o ridurre al minimo l'uso del processore). Qualcosa da guardare fuori per è che molte piattaforme condividono l'indirizzo e dati di bus tra processore e DMA. Così l'un componente è bloccata, o sospeso mentre gli altri usi del bus indirizzi e di dati. Così può aiutare o meno. Dipende da come la piattaforma è cablato.

Convertire il campo chiave per utilizzare numeri, anche noto come token . Poiché i token sono numerici, possono essere utilizzati come indici nella tabelle di salto (passare anche dichiarazioni) o solo indici nella array.

Come ultima risorsa, convertire il file binario. La versione binaria dovrebbe avere due campi: chiave come token e il valore. Haul nei dati in grandi blocchi nella memoria.

Sommario

  1. Haul grandi blocchi di dati in la memoria.
  2. Profilo prima di apportare modifiche al stabilire una linea di base delle prestazioni misurazione.
  3. Ottimizza un passo alla volta, profiling dopo ogni ottimizzazione.
  4. preferiscono mantenere file di dati in umana formato leggibile.
  5. Minimizzare le modifiche al file di dati.
  6. Converti file da usare lunghezza fissa campi.
  7. Provare a utilizzare fili o multi-tasking quindi l'applicazione non è in attesa.
  8. Testo Converti in gettoni numerici (Riduce la leggibilità umana)
  9. Dati Converti binari come ultima ricorrere (molto difficile per gli umani leggere e di debug).

Ho due idee per voi:

1) Se la lista dei tag è costante e noto in anticipo, si potrebbe convertire ognuna in un BYTE, (o WORD), seguito dalla lunghezza del valore (in byte), seguita dalla c-stringa greggio del carico utile del valore.

Per esempio, dato il seguente:

Tag1 = "hello World!" // 12 bytes in length (achieved by "strlen(value) * sizeof(char)" )
Tag2 = "hello canada!"  // 13 bytes in length 

Si potrebbe trasformare questo in flusso di byte:

0x0001 0x000B // followed by 12 bytes representing the 'value' // 0x0002 0x000C // followed by 13 bytes representing 'value2'

Il programma avrebbe solo bisogno di sapere che l'intestazione PAROLA "0x0001" rappresenta Tag1, e l'intestazione "0x0002" rappresenta Tag2.

Si potrebbe ancora di più astratto i nomi delle variabili, se non li conosce in anticipo, seguendo una lunghezza simile, struttura di valori.

2) Forse il po 'lento è solo l'implementazione della analisi del testo? Considerare l'utilizzo di una libreria open source dedicato per ciò che si sta cercando di fare. Esempio: " boost :: property_tree "

albero

La proprietà è specificamente progettato per memorizzare e recuperare le coppie valore chiave (progettato per l'uso come file di configurazione delle impostazioni). Ma credo che sarebbe dipenderà quanti tali coppie si sta cercando di negozio per questo di essere economico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top