2010-04-23 5 views
2

J'utilise mmap call pour lire à partir d'un très gros fichier en utilisant l'arithmétique du pointeur simple en C++. Le problème est que lorsque je lis plusieurs fois de petits blocs de données (dans l'ordre des Ko), chaque lecture prend le même temps que la précédente. Comment puis-je savoir si le disque est accédé pour répondre à ma demande ou si la demande est en cours de la mémoire principale (cache de page) dans les appels après le premier.Mise en cache en mmap

+0

Pourquoi est-ce important? –

+0

Vitesse! Je veux savoir pourquoi les appels suivants ne sont pas plus rapides que le premier quand je m'attends à ce qu'ils soient remplis du cache plutôt que par un accès au disque. – myahya

+0

avez-vous également profilé le temps qu'il a fallu pour l'appel mmap? Il est possible qu'il ait déjà mis en cache la première page lorsque vous avez invoqué mmap. Tous les principaux systèmes d'exploitation de bureau modernes seront mis en cache, car l'accès au disque est très coûteux, mais si vous avez un schéma d'accès très étrange, vous risquez de forcer des échecs de cache sur chaque accès (votre modèle d'accès est-il séquentiel?). –

Répondre

3

Le problème est le suivant: les deux lectures ont été effectuées à partir du cache. Je suppose que la mise en cache commence lorsque le fichier est ouvert ou mmapped, avant de demander les données. Pour vérifier cela, j'ÉMISSION:

echo 3 > /proc/sys/vm/drop_caches

qui débusque le cache, puis, si je lance deux itérations pour obtenir les mêmes données, la première manche est (dans mon cas) 10 fois plus lent que la seconde .

0

Vous obtiendrez les meilleures performances de cache si vous exploitez locality of reference. C'est-à-dire que si vous accédez à des variables proches les unes des autres en mémoire (par exemple en progressant d'une unité dans les variables) et que vous effectuez ces accès dans le temps (ie pas d'autres accès mémoire entre ces éléments) vous obtiendrez les meilleures performances de cache. Si chaque lecture prend à peu près le même laps de temps, il est très probable qu'elle soit mise en cache; Si les choses ne sont pas servies à partir du cache, cela est généralement indiqué par plusieurs lectures rapides (cache hits) suivies d'un pic (cache miss) suivi de lectures plus rapides. Sur presque tous les systèmes, un cache manquant provoque un bloc dans lequel les données résident à charger dans le cache, donc si vous accédez à des variables proches (qui sont dans le même bloc), ils seront dans le cache.