2015-08-18 1 views
0

J'ai des problèmes de performances lors de la lecture de fichiers volumineux. Je voudrais utiliser la cartographie de la mémoire pour résoudre les problèmes. Les fichiers d'entrée ont une taille maximale de 10 Go, mon programme (écrit en C++) est construit avec une configuration 32 bits, le système cible est Windows 64 bits et dispose de 24 Go de RAM. Est-ce possible de cartographier un énorme fichier en mémoire? Si oui, comment mon programme peut-il accéder à la zone d'adresse "haute" (> 0xFFFFFFFF, théoriquement, parce que mon programme est en 32 bits, donc les pointeurs sont aussi en 32 bits)?Mémoire mappant un fichier volumineux dans un logiciel 32 bits s'exécutant sur un système d'exploitation 64 bits

+0

Y at-il une raison pour laquelle vous ne compilez pas le programme en 64 bits? – NathanOliver

+0

Le programme a été écrit il y a longtemps. Il est mis à jour étape par étape, et 64 bits est dans le calendrier, mais pas maintenant. –

+0

Vous pouvez uniquement mapper le fichier en morceaux, voir MSDN MapViewOfFile https://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=vs.85).aspx. Notez qu'il utilise 2 DWORDS (high, low) comme décalage dans le fichier pour le début de la vue. Essayez de mapper <2 Go à la fois. –

Répondre

0

Vous ne pouvez pas. Un programme 32 bits utilise des pointeurs 32 bits qui ne peuvent pas dépasser 4 Go, même lorsqu'ils s'exécutent sur un système d'exploitation 64 bits. Une chose qui peut aider un peu, cependant, est de lier votre programme avec l'option /LARGEADDRESSAWARE. Par défaut, les programmes Windows 32 bits ne peuvent utiliser que 2GB de l'espace d'adressage, car certains programmes supposent que le bit le plus élevé d'un pointeur est toujours zéro et l'utilisent comme indicateur pour stocker des informations supplémentaires. Cela casserait si Windows commençait à allouer de la mémoire au-dessus de 2 Go, donc vous devez lier votre programme avec une option spéciale qui indique à Windows que votre programme n'en abuse pas. Cela permet à votre programme d'utiliser l'espace d'adressage complet de 4 Go au lieu d'être limité à 2 Go.

+0

Je suppose que les seuls programmes qui abusent si fort de la partie haute et qui sont si importants que MSVC se réserve le meilleur pour eux, doivent être écrits par les gens eux-mêmes. – user3528438

+0

Le premier paragraphe est correct, mais celui sur/LARGEADDRESSAWARE est trompeur et non pertinent. Au mieux,/LARGEADDRESSAWARE obtient un espace d'adressage utilisable de 32 Go en 32 bits, puisque le GB supérieur est toujours réservé au système, tout comme certains segments au milieu, donc même avec/LARGEADDRESSAWARE, vous n'aurez toujours pas plus de 2 Go d'espace _contiguous_, ce qui ne va pas aider duong_dajgja charger un fichier de 10 Go. –

+0

@AdrianMcCarthy, le fractionnement de 3 Go/1 Go est pour les fenêtres de 32 bits utilisant le ['/3GB'](https://msdn.microsoft.com/en-us/library/windows/hardware/ff556232%28v=vs. 85% 29.aspx) option de démarrage. Windows 64 bits n'a pas besoin de gigaoctet au sommet de l'espace d'adressage 32 bits, donc [les programmes 32 bits prenant en charge les adresses de grande taille peuvent utiliser les 4 Go complets] (http://blogs.msdn.com/b /oldnewthing/archive/2005/06/01/423817.aspx). (Je ne sais pas si Windows alloue toujours des choses au milieu de l'espace d'adressage, cependant.) – Wyzard

0

Dans un programme 32 bits, vous ne pourrez jamais mapper le fichier entier en une seule fois, car l'espace d'adressage est long de 2 Go. Ce qui est possible est de ne mapper qu'une partie du fichier à un moment donné en jouant avec les paramètres MapViewOfFile. Il est également possible de mapper le fichier entier à la fois avec plusieurs processus mappant 1 Go chacun (puisque les processus séparés ont des espaces d'adressage séparés), mais cela serait vraiment peu pratique à utiliser.

+0

Comme vous l'avez dit, pour un seul processus , l'espace adresse est de 2 Go de long, est-il possible pour une carte de processus 2 fichiers différents avec chaque fichier est de 1,5 Go de long? –

+0

@duong_dajgja Non, avec un espace d'adressage de 2 Go, vous ne pouvez pas mapper plus de 2 Go. Comme vous l'avez mentionné, ce n'est pas un problème de mémoire, il s'agit d'y accéder. 2x1.5GB ne rentrera pas dans l'espace d'adressage. Vous pourriez réussir si vous pouvez obtenir un espace d'adressage de 4 Go, comme mentionné dans la réponse de Wyzard. – ElderBug