IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scilab Discussion :

Limitations mémoire après appel de DLL


Sujet :

Scilab

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 60
    Points : 47
    Points
    47
    Par défaut Limitations mémoire après appel de DLL
    Bonjour,

    J'ai créé une fonction pour faire des tests de base dans Scilab avec la fonction call qui fait appel à une DLL écrite en C que j'ai créé. Voilà le code que je mets dans la DLL ou qui sert à compiler le .exe !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    unsigned int test2;
     
    	int errorCodeStreaming2 = 0;
    	unsigned int channelCount2 = 2;
    	unsigned int FetchBlockSize2 = 32768000;
    	unsigned int BufferSize2 = 8;
    	unsigned int *ptrMemory;
    	char conv[16];
    	char FilenameDebug[100];
    	char test[16];
     
    	strcpy_s(FilenameDebug,100,"E:\\Debug.ini");
     
    	test2 = (1*FetchBlockSize2*channelCount2*BufferSize2)+(4096*channelCount2);
    	ptrMemory = (unsigned int *)malloc((1*FetchBlockSize2*channelCount2*BufferSize2)+(4096*channelCount2));
     
    	if(ptrMemory==NULL)
    	{
    		errorCodeStreaming2 = -1;
    	}
    Dedans, je fais une allocation mémoire en C d'environ 500 Mo. Ce que je ne comprends pas, c'est pourquoi ça me retourne un pointeur nul quand je le lance depuis Scilab et que ça marche quand je ne passe pas par Scilab en compilant un .exe. Il s'agit du même code mot pour mot. Pour scilab il fonctionne quand même quand je ne lui demande que 65Mo d'allocation mémoire (buffersize2 à 1 au lieu de 8), mais si je double ou plus, j'ai un pointeur nul...alors que lancé directement depuis le .exe compilé sous visual c 2008, même les 500Mo passent (Buffersize2 à 8).

    J'ai surveillé la pile scilab, je ne la vois pas bouger quand il fait appel à la DLL donc je ne sais pas d'où vient cette limitation....!? La pile n'est pas énorme dans les 85M/115M mais ça reste constant quand je la regarde avec l'instruction stacksize qui me donne dans les 115 Millions en max et dans les 22000 en consommation (je crois qu'il faut multiplier par 8 toutes ces valeurs pour les avoir en octets d'après l'aide) . J'ai même mis une tempo Sleep de 40 secondes à la fin du code C après l'avoir mis dans un thread, pour pouvoir regarder la pile scilab avant qu'il ne sorte de la DLL en lancant "stacksize" dans la console, mais la pile ne bouge pas en conso. Le max passe bizarrement de 83M à 115M de temps en temps alors que pour moi, il devrait être fixe...! Pour info, j'ai utilisé l'instruction stacksize('max') pour avoir le max de la pile possible...

    J'utilise windows 7, 64 bits avec scilab 32 bits avec 8 Go de ram, il en reste plus de 5Go de disponible...

    Si vous avez une idée, je suis preneur... ! Je ne comprends pas le lien avec Scilab....scilab fait appel à la DLL mais ensuite qui gère la limitation mémoire du code écrit en C !? La pile Scilab !? Windows !? Je pensais que la DLL externe une fois appelée était indépendante...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 60
    Points : 47
    Points
    47
    Par défaut
    Finalement, ça fonctionne après être passé de Scilab 32 bits à Scilab 64 bits...! Je remarque que la pile en 64 bits a une valeur max bien plus grande, presque 3 fois plus grande dans mon cas...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 60
    Points : 47
    Points
    47
    Par défaut
    Par contre, j'ai un autre problème, j'ai fait évoluer mon programme de tests pour faire 3 allocations mémoires de 500 Mo environ (524296192 octets pour être précis).

    Quand je fais appel à ma DLL et que je retourne les 3 adresses pointeurs retournées par malloc

    ptrMemory1=458227824
    ptrMemory2=982581360
    ptrMemory3=112

    Quand j’exécute le même code sans passer par scilab en compilant un .exe :

    ptrMemory1=8454208
    ptrMemory2=532807744
    ptrMemory3=1057161280

    Là les adresses sont cohérentes, progressives et intercalées de plus de 500 Mo, ça marche très bien…. Il y a bien la place entre chaque adresse pour contenir 500 Mo de données.

    Je ne comprends donc pas les valeurs d'adresses retournées quand je passe par la DLL lancée depuis Scilab. On dirait que les données se marchent dessus avec la dernière adresse incohérente...je ne sais pas si c'est la pile de Scilab qui effectue les allocations....et si c'est le cas si c'est normal d'avoir des valeurs bizarres....je ne connais pas le fonctionnement de la pile Scilab...

    Voilà le nouveau code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    unsigned int SizeMemory;	
    	int errorCodeStreaming1 = 0;
    	int errorCodeStreaming2 = 0;
    	int errorCodeStreaming3 = 0;
    	unsigned int channelCount = 2;
    	unsigned int FetchBlockSize = 32768000;
    	unsigned int BufferSize = 8;
    	unsigned long *ptrMemory1;
    	unsigned long *ptrMemory2;
    	unsigned long *ptrMemory3;
     
    	char conv[16];
    	char FilenameDebug[100];
    	char test[16];
     
    	strcpy_s(FilenameDebug,100,"E:\\Debug.ini");
     
    	SizeMemory = (1*FetchBlockSize*channelCount*BufferSize)+(4096*channelCount);
    	ptrMemory1 = (unsigned long *)malloc(SizeMemory);
    	ptrMemory2 = (unsigned long *)malloc(SizeMemory);
    	ptrMemory3 = (unsigned long *)malloc(SizeMemory);
     
    	if(ptrMemory1==NULL)
    	{
    		errorCodeStreaming1 = -1;
    	}
     
    	if(ptrMemory2==NULL)
    	{
    		errorCodeStreaming2 = -1;
    	}
     
    	if(ptrMemory3==NULL)
    	{
    		errorCodeStreaming3 = -1;
    	}
     
    	_itoa_s(errorCodeStreaming1, conv, 10);
    	WritePrivateProfileStringA((LPCSTR)"Debug","errorCodeStreaming1",conv,(LPCSTR)FilenameDebug);
     
    	_itoa_s(errorCodeStreaming2, conv, 10);
    	WritePrivateProfileStringA((LPCSTR)"Debug","errorCodeStreaming2",conv,(LPCSTR)FilenameDebug);
     
    	_itoa_s(errorCodeStreaming3, conv, 10);
    	WritePrivateProfileStringA((LPCSTR)"Debug","errorCodeStreaming3",conv,(LPCSTR)FilenameDebug);
     
    	_itoa_s(SizeMemory, conv, 10);
    	WritePrivateProfileStringA((LPCSTR)"Debug","SizeMemory",conv,(LPCSTR)FilenameDebug);
     
    	_itoa_s(unsigned long(ptrMemory1), conv, 10);
    	WritePrivateProfileStringA((LPCSTR)"Debug","ptrMemory1",conv,(LPCSTR)FilenameDebug);
     
    	_itoa_s(unsigned long(ptrMemory2), conv, 10);
    	WritePrivateProfileStringA((LPCSTR)"Debug","ptrMemory2",conv,(LPCSTR)FilenameDebug);
     
    	_itoa_s(unsigned long(ptrMemory3), conv, 10);
    	WritePrivateProfileStringA((LPCSTR)"Debug","ptrMemory3",conv,(LPCSTR)FilenameDebug);
     
     
    	free(ptrMemory1);
    	free(ptrMemory2);
    	free(ptrMemory3);

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 60
    Points : 47
    Points
    47
    Par défaut
    Je viens de regarder....ma pile fait 223739903, soit 1,7 Go (je l'ai mise au max). Etant donné quie je fais pour 1,5 Go de d'allocation, ça pourrait être un débordement...mais bizarre que Scilab ne mette aucun message d'erreur...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 60
    Points : 47
    Points
    47
    Par défaut
    J'ai rempli toute l'allocation mémoire 1 de 1, l'allocation 2 de 2 et la 3 de 3 et il s'avère qu'en regardant toutes les cases, tout semble ok, les données sont bonnes, il n'y a pas d'écrasement. Je ne comprends pas l'adressage mémoire avec ces adresses bizarres, mais si ça fonctionne...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread non fermé après appel fonction dans DLL
    Par colorid dans le forum Langage
    Réponses: 6
    Dernier message: 02/04/2013, 16h19
  2. libération mémoire appel function dll externe delphi
    Par didoboy dans le forum C++/CLI
    Réponses: 6
    Dernier message: 28/10/2009, 12h05
  3. problème libération mémoire après une DLL
    Par salseropom dans le forum C
    Réponses: 22
    Dernier message: 03/09/2008, 12h51
  4. Réponses: 5
    Dernier message: 08/08/2008, 14h48
  5. Réponses: 17
    Dernier message: 27/04/2007, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo