La mia applicazione C # .NET deve leggere molti file con letture elettriche. Ci sono diversi calcoli da fare e i file di output devono essere generati.
A causa della natura dell'input sarebbe molto inefficiente da produrre dopo ogni riga di input o anche dopo un file, quindi sarebbe meglio farlo dopo un blocco di file.
Il motivo è che ogni file contiene un elenco di letture / unità elettriche per un timestamp, ma l'output deve essere costituito da file per ogni unità.
Quindi, per esempio, l'input sarebbe di 100 file ciascuno contenente per es. volt, ampere, watt, codice di stato per un timestamp (2015_08_31_00_00_00.txt, 2015_08_31_00_00_05.txt ...).
L'uscita dovrebbe essere per unità elettrica e ad es. un file al giorno
(c: //ampere/2015_08_31.txt, c: //volt/2015_08_31.txt ...).
Si noti che questa è un'immagine semplificata dell'applicazione. In realtà ci sono diversi formati di input e output, strutture di directory ecc.
Quello che voglio fare è, mantenere la calcolata e pronta per i valori di uscita in memoria e stamparli secondo strategie diverse. Questo potrebbe essere ad es. fino a quando non vengono elaborati tutti i file di input.
Dato che alcune strategie come questa possono comportare troppi dati in memoria, vorrei monitorare l'utilizzo della memoria e decidere se ho bisogno di produrre prima.
So come ottenere la memoria utilizzata del mio programma , ma come faccio a ottenere una stima sicura sulla memoria disponibile?
Per quanto ho capito, questo non è un compito semplice a causa della frammentazione della memoria, del paging, del cestino e così via. In questo caso, so che ho ottenuto il limite di memoria indotta a 32 bit con le impostazioni di generazione correnti, ma vorrei ottenere una risposta generale che potrebbe essere applicata anche a un programma a 64 bit.
Come faccio a stimare quando è ancora disponibile memoria sufficiente per scrivere su disco, ma utilizzare una buona quantità di RAM per ottimizzare l'I / O?
Aggiornamento
Non ho ancora implementato questa funzione, quindi non posso dire se i problemi di memoria si verifichino in circostanze normali. Grazie a tutti i tuoi commenti e risposte, vedo che non è facilmente realizzabile.
La mia idea attuale è quella di utilizzare un limite di input fisso in base alla dimensione dei file di input. Ciò non proteggerebbe ancora dai problemi se altri programmi creano un carico pesante. Ogni file è sempre di pochi KB.
Terrò a mente l'idea di SQLite ma dovrò controllare se ottengo un OK