2010-09-24 26 views
0

Je me demande s'il est possible d'insérer des pages vierges au début d'un gros fichier (multi-Go) que j'ai ouvert avec mmap(). Évidemment, il serait possible d'ajouter une page ou deux à la fin, et de tout faire avancer avec memcpy(), mais cela salirait toutes les pages et nécessiterait un temps énorme lorsqu'elles finiraient par être vidées sur le disque. Je suppose qu'une solution nécessiterait une coordination complexe entre un système de fichiers personnalisé et une manipulation manuelle des tables de pages: ajouter un bloc à l'inode, mettre à jour d'une manière ou d'une autre les pages mises en cache dans le VMM pour refléter ceci, puis swizzle la table de page pour correspondre. Cela semble non trivial, ce qui me fait me demander s'il y a un meilleur moyen. Ceci est une question assez profonde sur la mémoire et la manipulation de fichiers sous Linux, bien que je serais heureux d'apprendre comment cela peut être fait dans d'autres systèmes. Je ne suis pas particulièrement intéressé par les solutions de contournement qui impliquent de rendre la copie plus efficace, bien qu'une technique qui nécessite un remappage mais évite les E/S du disque serait un bon début.Insertion de pages dans de gros fichiers mmap() sans copier de données

+0

Je prévois beaucoup de cas d'angle - par exemple. Qu'arrive-t-il aux décalages des handles de fichiers dans ce fichier? Qu'en est-il des handles de fichiers dans d'autres processus? – caf

+0

Sans savoir ce que vous faites, cela pourrait être une suggestion stupide, mais pouvez-vous remplir le fichier physique avec des pages X avant de le mmap? Gardez un index/pointeur/déplacement dans la première page à l'endroit où les données réelles commencent et modifiez-les au besoin. Plus de travail tout autour mais vous semblez vouloir aller très loin pour faire ce travail. – Duck

+0

@Duck: Je n'ai pas de but en tête. J'ai voulu quelque chose comme ceci en traitant de grands index inversés pour la recherche en texte intégral et en regardant des manières de faire de meilleurs arbres B. Commencer avec un fichier extrêmement clairsemé est une idée intéressante, mais ne résout pas le cas général. –

Répondre

2

Intégrez un fichier FAT simple dans votre fichier. Par exemple, le premier 4k du fichier serait la page FAT. Les données seraient dans les pages suivantes. La première page FAT peut être liée à d'autres pages FAT au fur et à mesure de la croissance de votre fichier. Chaque entrée dans la graisse serait un index de page de données et l'index de la prochaine entrée FAT. Une entrée FAT serait la page de la FAT et l'index sur cette page de l'entrée elle-même. Je pense que vous avez l'idée. Les entrées FAT sont une liste liée. Les pages FAT sont une liste liée. Les entrées FAT lient les pages de données. Cela devrait être suffisamment d'informations pour utiliser remap_file_pages() pour que votre fichier soit contigu en mémoire même s'il n'est pas contigu sur le disque.