Question

Je veux utiliser une bibliothèque que les utilisations des descripteurs de fichiers comme les moyens de base pour accéder à ses données. Pour des raisons de performance, je ne veux pas avoir à engager des fichiers sur le disque chaque avant que j'utiliser les fonctions de cette bibliothèque.

Je veux créer (grandes) blobs de données à la volée, et appel à la bibliothèque pour les envoyer à un serveur. En l'état actuel, je dois écrire le fichier sur le disque, ouvrez-le, passez la FD à la bibliothèque, attendez qu'elle se termine, puis supprimez le fichier sur le disque. Depuis que je peux recréer les blobs sur demande (et ils ne sont pas si grandes qu'elles provoquent la pagination de la mémoire virtuelle excessive), les enregistrer sur le disque me apporte rien, et encourt une pénalité importante de la performance.

Est-il possible d'assigner un FD à un bloc de données qui se trouvent seulement comme une entité mémoire mappée?

Était-ce utile?

La solution

Vous pourriez monter un mémoire soutenu par le système de fichiers : http://lists.apple.com/archives/darwin-kernel/2004/Sep/msg00004.html

L'utilisation de ce mécanisme augmentera la pression de mémoire sur le système, et sera probablement paginée si la pression de la mémoire est assez grande. Il pourrait être intéressant d'en faire une option de configuration, dans le cas où l'utilisateur serait plutôt une autre application ont le premier choix de la mémoire.

Une autre option consiste à utiliser segments de mémoire partagée POSIX : http://opengroup.org/onlinepubs/007908799/xsh/shm_open.html (je ne l'ai pas utilisé des segments de mémoire partagée POSIX moi-même;. si je comprends bien, ils ont été conçus pour résoudre exactement ce problème)

La fonction shm_open() crée un objet de mémoire et renvoie un descripteur de fichier. Vous pouvez ensuite mmap(2) ce descripteur de fichier, faites votre travail, et de transmettre le descripteur de fichier à la bibliothèque.

Ne pas oublier de shm_unlink l'objet lorsque vous avez terminé; Posix partagé segments de mémoire, les files d'attente de messages, et les tableaux sémaphores ne vont pas automatiquement loin quand le dernier processus se termine.

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