Come gestire efficientemente le uscite intermedie?

0

Sto implementando un preprocessore C in C ...

Ho le tre funzioni:

  1. funzione di sostituzione del trigramma che
  2. Funzione splicing linea
  3. funzione di rimozione dei commenti

Tuttavia queste funzioni funzionano separatamente sui file i.e.

La prima funzione prenderà un file e sostituirà i trigraph producendo un file temp1 come output

La seconda funzione prenderà temp-file1 come input e unirà le linee e produrrà un altro temp-file2.

La terza funzione prenderà temp-file2 come input e rimuoverà il commento e produrrà ancora un altro temp-file3.

E ora le principali attività di pre-elaborazione verranno eseguite su temp-file3 e un file .i verrà prodotto come output finale.

Ora ho 3 opzioni:

  1. Utilizza i file temporanei
  2. usa le pipe
  3. al posto di file temporanei temporanei o pipe usano stringhe (vale a dire interi temp-file1, 2 e 3 saranno tre grandi stringhe !!)

Ho tre dubbi ...

  1. L'opzione 1 sembra meno efficiente dell'opzione 2
  2. l'opzione 2 sembra essere perfetta, ma sarò limitato dalle dimensioni di quella pipa senza nome? (dato che ho un singolo processo , la funzione 1 2 & 3 sarà chiamata una dopo l'altra) Che cosa succede se la dimensione dell'output della temp > capacità totale del tubo?
  3. opzione 3 ... È efficiente, facile rispetto alle precedenti due?

Per favore dimmi, quale opzione dovrei scegliere?

    
posta Sam 28.03.2013 - 11:05
fonte

3 risposte

2

l'opzione 4 consiste nel rifattorizzare le funzioni in modo che possano lavorare su uno stream e elaborare solo i dati secondo necessità

in sostanza si chiama la funzione 3 se ha bisogno di più dati chiamerà la funzione 2 e se ha bisogno di più dati chiama la funzione 1 che legge direttamente dal file di input; questo trasformerà il preprocessore in un singolo passaggio invece del 4-pass che hai ora

l'opzione 5 è l'elaborazione simultanea, in cui si utilizza una coda produttore-consumatore tra il produttore 1 e il consumatore 2 e una coda tra il produttore 2 e il consumatore 3, che produce per l'elaborazione principale

l'opzione 5 ti consentirà di riutilizzare più codice poiché puoi semplicemente sostituire tutto fwrite s con push es e tutto fread con poll s (ogni blocco mentre il buffer si riempie / diventa vuoto) ma dovrai generare un thread per ogni funzione

    
risposta data 28.03.2013 - 11:57
fonte
0

L'opzione 1 è un modo di allocare memoria (in questo caso, dalla cache della pagina), con i seguenti avvertimenti:

  • se i tuoi file temporanei non si trovano nel (a) file system temporaneo, i tuoi dati anche saranno scritti inutilmente sul disco
  • è possibile che altri processi leggano e magari modifichino i file temporanei

L'opzione 2 non funzionerà come indicato: il buffer di pipe sarà compilato e la tua scrittura verrà bloccata. I tubi sono sicuri solo se vengono letti e amp; scritto in modo concorrente (indipendentemente da processi diversi, thread diversi o co-routine opportunamente coordinate).

L'opzione 3 è ragionevole. Nota che se le tue tre funzioni possono solo abbreviare il file, puoi semplicemente riscrivere un singolo buffer sul posto.

    
risposta data 28.03.2013 - 11:24
fonte
0

Tutte e tre le opzioni presentano seri inconvenienti.

  • Come indicato da @Useless in la sua risposta , i file temporanei hanno lo svantaggio di fare inutilmente l'accesso al disco con rischio di entità esterne che modificano i file.
  • Entrambe le opzioni 2 e 3 limitano la dimensione dei file che è possibile elaborare. Nell'opzione 2, questo è limitato dal buffer interno delle pipe e nell'opzione 3 è limitato dalla quantità di memoria disponibile.

Consiglierei di prendere in considerazione una quarta opzione:

Hai elencato per fasi nell'elaborazione

  1. elaborazione del trigramma
  2. splicing di linea
  3. rimozione dei commenti
  4. pre-elaborazione principale

L'opzione 4 sarebbe che ogni fase chiama la funzione dello stadio precedente per fornirgli i caratteri che sono stati elaborati fino a quel punto.
Quindi, la funzione di pre-elaborazione principale richiede caratteri dalla funzione di rimozione dei commenti.
La funzione di rimozione dei commenti a sua volta richiede caratteri dalla funzione di splicing della linea. Se quei caratteri indicano l'inizio di un commento, vengono richiesti più caratteri fino a quando non viene visualizzato l'intero commento. Questi caratteri vengono scartati e viene restituito un singolo spazio al chiamante. I caratteri all'esterno dei commenti vengono restituiti così come sono.
Le funzioni di splicing della linea e di trigraph funzionano in modo simile, con la funzione del trigramma che è l'unica che legge un file.

    
risposta data 28.03.2013 - 11:51
fonte

Leggi altre domande sui tag