Domanda

Attualmente stiamo pensando di creare un sistema cache per contenere i dati estratti da un database SQL e renderli disponibili a un paio di altre applicazioni (sito Web, servizio Web, ecc.). Immaginiamo che la cache sia in esecuzione come un servizio di Windows e sostanzialmente sia costituita da un dizionario intelligente che contiene le voci della cache. La mia domanda è: esiste un limite al set di lavoro dell'applicazione (verrà eseguito con Windows Server 2003)? O la quantità di memoria fisica è il limite?

È stato utile?

Soluzione

32 bit o 64 bit? 32 bit è 2 GB (per un processo), 64 bit è 1 TB (server Enterprise Edition 2003) .

Tuttavia, la dimensione massima di un oggetto CLR è di 2 GB anche a 64 bit.

Aggiornamento: le informazioni di cui sopra erano corrette nel 2008. Vedi Risposta di Ohad per più recenti informazione. Il server Windows 2016 può avere un massimo di 24TB .

Altri suggerimenti

Di recente ho fatto una profilazione approfondita dei limiti di memoria in .NET su un processo a 32 bit. Siamo tutti bombardati dall'idea che possiamo allocare fino a 2,4 GB (2 ^ 31) in un'applicazione .NET, ma sfortunatamente non è vero :(. Il processo di applicazione ha così tanto spazio da usare e il sistema operativo fa un ottimo gestendolo per noi, tuttavia, .NET stesso sembra avere un proprio overhead che rappresenta circa 600-800 MB per le tipiche applicazioni del mondo reale che spingono il limite di memoria. Ciò significa che non appena si alloca un array di numeri interi che richiede circa 1.4GB, dovresti aspettarti di vedere OutOfMemoryException ().

Ovviamente a 64 bit, questo limite si verifica molto più tardi (parliamo tra 5 anni :)), ma cresce anche la dimensione generale di tutto ciò che è in memoria (sto trovando che è ~ 1,7 a ~ 2 volte) a causa della maggiore dimensione delle parole .

Quello che so per certo è che l'idea di memoria virtuale dal sistema operativo NON ti dà sicuramente spazio di allocazione praticamente infinito all'interno di un processo. È solo lì che l'intero 2,4 GB è indirizzabile a tutte le (molte) applicazioni in esecuzione contemporaneamente.

La seguente tabella da MSDN è la risposta più precisa alla tua domanda. Si noti che il flag IMAGE_FILE_LARGE_ADDRESS_AWARE non può essere impostato direttamente dal compilatore gestito, anche se fortunatamente può essere impostato post build tramite l'utilità editbin . 4GT si riferisce alla bandiera / 3gb.

alt text

Su Windows a 32 bit puoi ottenere un po 'più di memoria avviando Windows con il flag / 3gb e contrassegnando la tua app come " large address aware "

Matthias,

In realtà non è una risposta alla domanda diretta, ma un altro modo di affrontare questo problema che aggirerà alcune delle grandi insidie, che possono essere un grosso mal di testa con soluzioni di cache. (Mi dispiace non ho alcuna lettura consigliata sull'argomento.)

Lo abbiamo implementato in un precedente progetto e ha creato altri problemi.

Per l'accesso offline, puoi usare sql Express sui desktop per creare un mirror del tuo database (o solo il bit che devi memorizzare nella cache)? Quindi tutto ciò che devi fare è cambiare il database a cui punta l'applicazione. Puoi anche usarlo per archiviare le differenze e riprodurle sul server, anche se questo ha altri problemi. Puoi modificare le autorizzazioni sulla copia locale per renderla di sola lettura se è così che dovrebbe essere.

I dizionari che stai pensando di creare hanno un suono straordinariamente simile agli indici SQL. Farei affidamento su sql per fare il lavoro per te se puoi progettarlo in quel modo. Perché reinventare quella ruota? In tal caso, dovrai valutare attentamente la scadenza della cache e la gestione della memoria, in particolare se si tratta di un servizio Windows.

Buona fortuna

Sam

Come con qualsiasi altro programma Windows, sei limitato dallo spazio degli indirizzi. Cioè: su 32 bit, puoi avere 2 GB di spazio indirizzo. Su x64, puoi avere 8 TB.

Se non hai 8 TB di memoria fisica, inizierà la pagina.

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