Comment utiliser la mémoire virtuelle (swap dans le système de fichiers Linux) dans la programmation web java

StackOverflow https://stackoverflow.com/questions/1506634

Question

Je travaille dans l'application web java. Dans une section i utilise la variable d'arbre très grand qui sauvent et persistent dans la mémoire (RAM). Puis-je migrer cette mémoire virtuelle (swap). Note: grand arbre se compose nom et email pour tous les utilisateurs qui utilisent Ajax dans la suggestion zone de texte.

Était-ce utile?

La solution

Il n'y a pas un moyen standard sous Linux de forcer un bloc de mémoire à échanger, ainsi la machine virtuelle Java ne sera pas une façon de demander à l'OS d'effectuer une telle tâche.

Le mieux que vous pouvez faire si vous voulez que cette fonctionnalité est de sérialiser l'arbre et écrire les données brutes dans un fichier de disque puis le ramener lorsque vous êtes prêt pour cela.

Mais vous ne voulez probablement pas, parce que l'écriture sur un disque est très lent par rapport à la mémoire physique i / o.

Cas d'espèce, laisser le souci du système d'exploitation à ce sujet. Il est sûr de supposer qu'il connaît une meilleure façon de gérer la mémoire que vous faites.

Autres conseils

Laissez le système d'exploitation de votre utilisateur utilise prendre soin de cela.

Une image java en cours d'exécution que les pages partiellement en swap est une image java morte. Dès qu'un des coups de pied assez désireux GC, vous obtenez tout page avant. La page est assez mauvais. Si vous n'avez pas fait assez de RAM pour le tout, vous vous retrouvez avec une raclée, épave qui ne répond pas d'un serveur. Java est paginée Bad (tm).

Si vous avez suffisamment de RAM pour la chose, vous n'avez pas besoin du tout échange.

Stuff votre liste à une table de base de données, sur le disque, l'indexer, limiter vos jeux de résultats, et faire les requêtes appropriées contre. Ce sera une victoire nette, et la base de données peut mettre en cache les pages qu'il aime le plus, donc vous ne devez pas penser à ce sujet.

Ou plus de RAM.

Votre système d'exploitation gère automatiquement sa propre mémoire et pousse les choses à l'swapfile au besoin.

Si vous avez beaucoup de données, vous pouvez envisager de stocker vos données dans une base de données au lieu d'un énorme en mémoire arbre. Ce serait probablement permettre à votre échelle d'application mieux, et il peut également améliorer les performances -. Il serait certainement vous donner de meilleures performances que la lecture et l'écriture de la totalité de la structure sur le disque chaque fois que vous devez rechercher ou modifier un enregistrement

Edit: Vous ne devez pas nécessairement de mettre en place une machine de base de données dédiée. Étant donné que vous essayez actuellement de stocker toutes vos données dans la mémoire en ce moment, vous pouvez probablement utiliser une base de données intégrable comme HSQLDB ou SQLite, qui ont des limites de taille de 16 Go et 2 To, respectivement.

Je trouve intéressant que tout le monde lui dit que le stockage des éléments sur le disque est terriblement terriblement ineficient, et en même temps il recomending utiliser une base de données, probablement une distance qui va stocker les données sur le disque .. sur une autre machine ..

Vous présumez que le système sera plus efficace lors de la manipulation aveuglément le fichier d'échange qu'il serait d'avoir le fichier d'échange influencé par le code qui sait ce que l'avenir nous réserve. il est beaucoup plus efficace pour échanger de la mémoire que vous savez ne va pas être utilisé pendant un certain temps que pour le système de regarder tous les éléments en mémoire et de tenter de mettre efficacement certaines d'entre elles dans ce fichier.

Bien sûr, tout en étant mauvais, vous êtes tous un peu juste .. une base de données locale serait la façon la plus efficace de stocker des données dans un fichier (où il sera écrit et lu). Si vous n'avez pas accès à une base de données locale, puis de code un. Un hashmap est conçu pour être stocké dans la mémoire et une liste liée ordonnée indexé est conçu pour être stocké sur le disque. Essayer de pousser directement de la mémoire sur le disque sans une certaine considération pour l'efficacité des deux médiums ne sont pas efficaces.

Que diriez-vous cela comme une opinion différente sur le même problème: je crée beaucoup de côté serveur PDF, j'ai 10 de de 1000 de clients qui veulent généralement d'exécuter des rapports en même temps du mois. PDF taille moyenne pourrait être 7-10Mb. Avec un tas fini disponible, « échange » les données vers un fichier temporaire est un moyen valable pour créer les fichiers PDF que je dois être en mesure de définir la longueur du contenu de la réponse avant diffusion des données PDF au client.

Peut-être au lieu de simplement remettre en question la conception des options utiles pourraient être à portée de main. Personnellement, je suis à la recherche à l'aide de l'un fichier temporaire par processus ou un accès simultané d'un seul fichier « swap ».

Que proposeriez-vous?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top