Domanda

Io lavoro in applicazioni Web Java. In qualche parte io uso molto grande variabile albero che salvare e persistono nella memoria (RAM). Posso migrare questa alla memoria virtuale (swap). nota: enorme albero composto da nome e indirizzo email per tutti gli utenti che utilizzano in suggestione Ajax casella di testo.

È stato utile?

Soluzione

Non c'è un modo standard in Linux di forzare un blocco di memoria per scambiare, così la JVM non avrà un modo di chiedere al sistema operativo di eseguire tale compito.

Il meglio che si può fare se si desidera questa funzionalità, è quello di serializzare l'albero e scrivere i dati grezzi in un file su disco poi riportarlo quando si è pronti per questo.

Ma probabilmente non si vuole questo, perché la scrittura su un disco è estremamente lento rispetto alla memoria fisica di I / O.

Caso in questione, lasciare che la preoccupazione su questo sistema operativo. E 'lecito ritenere che conosce un modo migliore di gestire la memoria di te.

Altri suggerimenti

Lasciate che il vostro sistema operativo utente sta utilizzando prendersi cura di questo.

Un'immagine in esecuzione Java che in parte le pagine fuori al di swap è un'immagine Java morto. Non appena un desiderosi calci GC abbastanza, si arriva alla pagina tutto torna. La pagina in è già abbastanza grave. Se in realtà non hanno abbastanza RAM per il tutto, si finisce con una botte, relitto non risponde di un server. Paged Java è inappropriato (tm).

Se avete abbastanza RAM per il tutto, non hai bisogno di swap a tutti.

Roba vostra lista per una tabella di database, sul disco, indicizzarlo, limitare la vostra set di risultati, e fare le query appropriate contro di essa. Sarà una vittoria netta, e il DB può memorizzare nella cache le pagine che piace di più, in modo da non devi pensarci.

O ottenere di più RAM.

Il vostro sistema operativo gestisce automaticamente la propria memoria e spinge le cose per il file di swap, se necessario.

Se si dispone di un sacco di dati, si potrebbe prendere in considerazione l'archiviazione dei dati in un database invece di un enorme albero in memoria. Ciò probabilmente permettere che la tua scala di migliore applicazione, e può anche migliorare le prestazioni -. Sarebbe certamente dare prestazioni migliori rispetto leggere e scrivere l'intera struttura su disco ogni volta che è necessario guardare in alto o modificare un record

Edit: Non necessariamente deve impostare una macchina database dedicato. Dato che si sta attualmente cercando di memorizzare tutti i dati in memoria in questo momento, probabilmente si può utilizzare un database integrato come HSQLDB o SQLite , che hanno limiti di dimensione di 16 GB e 2 TB, rispettivamente.

Trovo interessante il fatto che tutti lo sta dicendo che la memorizzazione degli elementi sul disco è terribilmente terribilmente ineficient, e allo stesso tempo raccomandarlo che usa un database, probabilmente un unico telecomando che sta per memorizzare i dati su disco .. su un'altra macchina ..

si stanno assumendo che il sistema sarà più efficiente durante la manipolazione ciecamente il file di swap di quanto non lo sarebbe di avere il file di swap influenzato dal codice che sa cosa riserva il futuro. è di gran lunga più efficiente di scambiare la memoria che si sa non sta per essere utilizzato per un po 'di quanto lo sia per il sistema a guardare tutti gli elementi in memoria e tentare di mettere efficacemente alcune delle quali in quel file.

Naturalmente pur essendo sbagliato si è tutti un po 'a destra .. un database locale sarebbe il modo più efficiente di memorizzare i dati in un file (dove verrà scritto e letto). Se non si ha accesso a un database locale, allora il codice uno. Un hashmap è progettato per essere memorizzati nella memoria e un elenco collegato indicizzato ordinata è progettato per essere memorizzati sul disco. Cercando di spingere direttamente dalla memoria al disco senza alcuna considerazione per l'efficienza di entrambi i mezzi non è efficace.

Che ne dite di questo come un approccio diverso sul lo stesso problema: Sto creando un sacco di file PDF sul lato server, ho 10 di 1000 di clienti che in genere vogliono eseguire i rapporti allo stesso periodo del mese. Dimensione media PDF potrebbe essere 7-10Mb. Con un mucchio finita disponibili, 'scambiare' i dati in un file temporaneo è un modo valido per creare i file PDF da quando ho bisogno di essere in grado di impostare il Content-Length sulla risposta prima di streaming di dati in formato PDF al cliente.

Forse invece di mettere in discussione il disegno alcune opzioni utili potrebbero essere a portata di mano. Personalmente mi sto guardando utilizzando un unico file temporaneo per ogni processo o l'accesso simultaneo di un singolo file 'scambio'.

Che cosa suggerisce?

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