Disco eseguito il dizionario/cache per c#

Sto cercando una goccia di soluzione per la memorizzazione nella cache di grandi dimensioni-ish quantità di dati.

relative domande, ma per le diverse lingue:

Chiudere la questione in termini diversi:

Non ho bisogno (o voglia pagare nulla per) la persistenza, le transazioni, la sicurezza dei thread o simili e volete qualcosa che è molto più complesso da usare di un Elenco<> o Dizionario<>.

Se devo scrivere il codice, mi limiterò a salvare il tutto come file nella directory temp:

string Get(int i)
{
   File.ReadAllText(Path.Combine(root,i.ToString());
}

Nei miei casi indice sarà un int (e devono essere consecutivi o abbastanza vicino), e i dati saranno string in modo che si può ottenere con il trattamento sia di un POD e preferisce andare ultra-luce e fare esattamente questo.

L’utilizzo è che ho una sequenza di 3k file (come nel file #1 a #3000) di complessivi 650 MB e la necessità di fare un diff per ogni passo della sequenza. Mi aspetto che per un totale di circa lo stesso o un po ‘ di più e non voglio tenere tutto in memoria (casi più lungo in cui non posso).


Un certo numero di persone hanno suggerito diverse soluzioni per il mio problema. Tuttavia, nessuno sembra essere destinato anche alla mia piccola nicchia. I motivi che mi sto guardando disco di memorizzazione nella cache è perché sto aspettando che il mio uso attuale consumo di 1/3 a 1/2 del mio spazio di indirizzi disponibili. Sono preoccupati che più casi solo piatto di esaurire lo spazio. Io non sono preoccupato per il calpestio, la persistenza o la replica. Quello che sto cercando è una soluzione di minima usando un minimo di codice, un minimo di utilizzo del piede di stampa, minimo overhead di memoria e di complessità minima.

Sto cominciando a pensare che sono eccessivamente ottimista.

  • E perché non il filesystem? Questo è ciò che è stato progettato per…
  • Io se qualcuno non mi punto a qualcosa di meglio che è già scritto.
  • Non una cache su disco tipo di sconfiggere l’intero scopo di un meccanismo di cache?
  • Dipende da dove i dati sono provenienti da. Se è memoizing costoso valore calcolato o dati provenienti lenta collegamento internet può essere più che ragionevole.
  • Ho appena imbattuto in un problema simile… Ancora a caccia di una soluzione



10 Replies
  1. 4

    Ciò che si vuole veramente è un B-Albero.
    Che il primario della struttura di dati che un database utilizza.
    È stato progettato per consentire in modo efficiente swap parti di una struttura di dati da e per il disco, se necessario.

    Non so di qualsiasi ampiamente usato, di alta qualità autonomo B-Albero di implementazioni per C#.

    Tuttavia, un modo facile per ottenere uno sarebbe quello di utilizzare un Sql server. Sql Compact motore verrà eseguito in-processo, quindi non c’è bisogno di un separato esecuzione del servizio. Essa vi darà un b-albero, ma senza mal di testa. Si può semplicemente utilizzare SQL per accedere ai dati.

    • Io non ho simpatia per l’overhead. Vedere le mie modifiche, ma ho potuto ottenere via con un singolo in memory array guardare in alto e un singolo disco di lettura per il carico in modo che il B-Tree è eccessivo… nel mio caso.
    • Un vantaggio dell’utilizzo del proc DB è che ti dà accesso percorso di indipendenza. Quando è necessario cambiare ciò che si informazioni o che cosa le chiavi necessarie per l’accesso, non c’è bisogno di ri-scrivere una grande fetta della tua app
    • Tuttavia, se si veramente sentire che le cose che si devono fare con i dati che semplice, quindi io penso che si potrebbe qualcosa da zero, che ha usato il Dizionario(int, string), in cui la stringa è stata un nome di file, in circa 2-3 ore di lavoro….
  2. 2

    Disclaimer – io punto a un prodotto che mi sento coinvolto nel.

    Sto ancora lavorando sul sito web lato delle cose, quindi non c’è un sacco di informazioni, ma Serial Killer sarebbe una buona misura per questo. Ho esempi che utilizzano .Netto di serializzazione (in grado di fornire esempi), così la scrittura di un persistente mappa cache .Net oggetti serializzabili sarebbe banale.

    Abbastanza spudorata autopromozione – se interessati, usare l’apposito link presente sul sito.

    • +1 per cose affini, ma sto cercando di più per ultra-light solutions (l’ideale sarebbe in cui la chiave & i valori sono entrambi POD e vengono memorizzati come dati binari blocchi)
    • SerialKiller è dannatamente luce mi dispiacerebbe per voi per chiudere per questo motivo! L’interfaccia è fondamentalmente un mapping da un tasto (generata dal sistema) a un flusso binario.
    • L’ingenuo, probabilmente buggy e extendability versione di quello che sto cercando (saltando sfratto cose di politica potrebbe essere fatto in circa 30 LOC. Mi piacerebbe essere colpito, se si potrebbe ottenere anche la metà della vostra lista di funzionalità in nder che.
    • Da “luce”, mi riferisco più a runtime le spese generali, che sono molto bassi. Non ho contato LOC, ma la DLL sono sotto i 500kb in totale, che, data la capacità, è molto magra.
    • saltando di iterazione e ricorsione (inutili in questo caso) LOC ~ tempo di esecuzione (per alcuni valori di LOC 🙂
    • Io non sono d’accordo. Il superamento di problemi di frammentazione del file system e di strategie di memorizzazione nella cache in grado di influenzare notevolmente il tempo di esecuzione, in modo che le prestazioni possono essere inversamente proporzionale alla LOC!

  3. 2

    Questo è molto simile alla mia domanda

    Alla ricerca di un semplice standalone persistente dizionario implementazione in C#

    Non penso che una libreria che esattamente si adatta ciò che si vuole esiste, forse il suo tempo per un nuovo progetto su github.

    • Aggiunto il link. Che ne dici di aggiungere un link in altro modo?
    • OTOH la motivazione è diversa. state cercando la persistenza, ho voglia di negozio di roba sul disco anziché in memoria. Grandi si sovrappongono, ma non del tutto.
    • Nessun problema, ho aggiunto un link dal mio post
  4. 0

    Prova a guardare NCache qui anche.

    Io non sono affiliato con questa azienda. Ho appena scaricato e testato la loro versione express gratuita.

  5. 0

    Ho parzialmente poprted EhCache applicazione Java .NETTO Il caching distribuito non è ancora implementata, ma su un singolo nodo, tutti originali UnitTests pass. Completa OpenSource:

    http://sourceforge.net/projects/thecache/

    Posso creare un file binario drop se ne hai bisogno (solo codice sorgente è disponibile ora)

    • sembra un progetto pulito. OTOH sembra eccessivo per me.
  6. 0

    Mi raccomando la memorizzazione nella Cache dell’Applicazione blocco di Enterprise Library dalla SIGNORA Che è stato consigliato, ma il link punta ad un articolo di Accesso ai Dati porzione di Enterprise Library.

    Ecco il link per la memorizzazione nella Cache di Blocco Applicazione:

    http://msdn.microsoft.com/en-us/library/cc309502.aspx

    E, in particolare, si vuole creare un nuovo archivio di backup (se uno che si ostina a disco non c’è):

    http://msdn.microsoft.com/en-us/library/cc309121.aspx

  7. 0

    Dato il vostro recenti modifiche alla domanda, io suggerisco di implementare la soluzione notato la tua domanda in quanto è molto difficile trovare un ingenuo soluzione avvolto in una libreria per il riutilizzo.

    • Buona possibilità. Se lo faccio, vi posto il codice.

Lascia un commento