2014-06-16 2 views
4

Je suis en train de mapper la mémoire d'un fichier volumineux (~ 200 Go) en une seule région/vue et en y écrivant séquentiellement. De temps en temps, j'effectue un boost::interprocess::mapped_region::flush(last, current, false).Libération de la mémoire mappée

Après un certain temps le processus utilise la totalité de la mémoire du système. Ce qui, d'après ce que je comprends, est normal car il libère la mémoire en tant que mémoire de demande de processus. Cela fonctionne bien sur Windows 8. Cependant, sous Windows 7, il ne semble pas très bien fonctionner avec les pilotes des cartes vidéo AJA et cela commence à affecter les performances (suppression des paquets d'E/S). Existe-t-il un moyen de forcer Windows 7 à vider des parties de la mémoire sur le disque (après que les données sont écrites, elles ne sont intéressantes que pendant quelques secondes, et souvenez-vous que j'écris séquentiellement dans le fichier entier), ne pas utiliser toute la mémoire système disponible?

+3

S'il vous plaît commenter si -1. – ronag

Répondre

3

Flushing n'a rien à voir avec la remise en état, Iyam. Il s'assure simplement que les pages corrompues sont écrites (je pense que vous avez toujours besoin d'une synchronisation de disque pour vous assurer que le disque est bien sur /).

Alors, vous êtes à la recherche d'un moyen de unmap.

Peut-être que vous pouvez utiliser une fonction comme

Bien sûr, d'une manière plus portable, vous pourriez vous contenter de démapper et de remapper. Si l'accès doit tourner HDD et reste séquentiel à travers remappe, il pourrait y avoir une pénalité de performance (il pourrait y avoir, si le noyau préextrait des données, par exemple madvise() ou l'équivalent de Windows)

Questions connexes