Προς το περιεχόμενο

malloc, Vector πολλών διαστάσεων


kfoynt

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα

 

Χρειάζομαι να φτιάξω ένα διάνυσμα το οποίο ειναι σχεδόν 35.000.000 θέσεων για double.

Μου έχουν δώσει ένα αρχείο το οποίο χρησιμοποιεί

>VECT(P->qcoeff, double, max_nzq)

 

όπου max_nzq οι διαστάσεις. Αλλά όταν πάει να εκτελέσει την γραμμή μου λέει:

No memory for 34000000 elements of size 8

 

Προσπάθησα να χρησιμοποιήσω malloc

>P->qcoeff = (double*)malloc(max_nzq*sizeof(double));

 

αλλά τώρα παίρνω segmentation fault, και στον debugger άμα προσπαθήσω να δώ αν παίρνει τιμές το διάνυσμα qcoeff λέει:

 

Cannot access memory at address 0xf7f50aa8

 

Καμία ιδέα κάποιος? παίζει κάποιος περιορισμός από τον compiler?

 

---------- Προσθήκη στις 01:41 ---------- Προηγούμενο μήνυμα στις 01:02 ----------

 

έτρεξα

 

>ulimit -s unlimited

 

για να μεγαλώσω το stack, αλλά πάλι τα ίδια... παίζει που ειμαι κάτω απο virtual machine σε linux??

Δημοσ.

Σε Windows XP ο παρακάτω κώδικας δεσμεύει 35.000.000 double (=8 byte) δηλαδή 280ΜΒ, δίχως πρόβλημα:

 

>
#include <stdio.h>
#include <stdlib.h>

int main()
{
double *ptrDblMem = NULL;

if((ptrDblMem = (double*)calloc(35000000, sizeof(double))) == NULL)
	printf("calloc failed.\n");
else
{
	printf("calloc ok.");
	free(ptrDblMem);
}

printf("\n\nPress Enter to exit ..");
getchar(); return 0;
}

 

Linux δεν έχω πρόχειρο για να κάνω δοκιμές - κοίταξε αν μπορείς να αυξήσεις την διαθέσιμη μνήμη (ειδικά αφού δουλεύεις σε περιβάλλον VM) ή έλεγξε αν διαχειρίζεσαι σωστά προ του seg.fault. την δεσμευμένη μνήμη (κάνε step-by-step execution ή βάλε κάποιο watch condition από τον debugger σου μέχρι να χτυπήσει το πρόβλημα). Αν το πρόβλημα παραμένει δες το Valgrind (ειδικό software εντοπισμού σφαλμάτων μνήμης κτλ για Linux) για το οποίο έχω ακούσει καλά λόγια.

 

Καλή τύχη!

Δημοσ.

Σε virtual box με ubuntu 32bit και 2GB mem, δεν φαινεται να υπάρχει πρόβλημα. Μήπως δεν εχεις δώσει αρκετή μνημη στο virtual machine ?

Δημοσ.
Σε virtual box με ubuntu 32bit και 2GB mem, δεν φαινεται να υπάρχει πρόβλημα. Μήπως δεν εχεις δώσει αρκετή μνημη στο virtual machine ?

 

Λοιπόν, έβαλα mxDestroyArray (ειναι library απο matlab) και έσβηνα ότι δεν χρειαζόταν, κατάφερα να το κάνω να προχωρήσει λιγο παρακάτω, αλλά μετά ξανα αντιγράφει κάποια διανύσματα (δεν φταίω εγώ για αυτό, η βιβλιοθήκη που μου έδωσαν αντιγράφει τις μεταβλητές) και τώρα ζητάει double θέσεις για 70.000.000!!!! Δυστυχώς δεν μπορώ να το αλλάξω αυτό γιατί θα πρέπει να αλλάξω όλη την δομή του αλγοριθμού. Οπότε, κάτι πρέπει να κάνω με την μνήμη...

 

για το VM του έχω δώσει 1024 RAM, 20 GB σκληρό, για βοήθησε λιγο με αυτό.. τα ulimit -s,-d,-m τα έχω unlimited.

 

ευχαριστώ by the way.

Δημοσ.
Λοιπόν, έβαλα mxDestroyArray (ειναι library απο matlab) και έσβηνα ότι δεν χρειαζόταν, κατάφερα να το κάνω να προχωρήσει λιγο παρακάτω, αλλά μετά ξανα αντιγράφει κάποια διανύσματα (δεν φταίω εγώ για αυτό, η βιβλιοθήκη που μου έδωσαν αντιγράφει τις μεταβλητές) και τώρα ζητάει double θέσεις για 70.000.000!!!! Δυστυχώς δεν μπορώ να το αλλάξω αυτό γιατί θα πρέπει να αλλάξω όλη την δομή του αλγοριθμού. Οπότε, κάτι πρέπει να κάνω με την μνήμη...

 

για το VM του έχω δώσει 1024 RAM, 20 GB σκληρό, για βοήθησε λιγο με αυτό.. τα ulimit -s,-d,-m τα έχω unlimited.

 

ευχαριστώ by the way.

 

Δε γνωρίζω τι απαιτήσεις μνήμης έχει ένας πίνακας του matlab και αν κρατάει και άλλα πράγματα εκτός από τα δεδομένα, αλλά υποθέτω πως δε δημιουργεί πρόβλημα αυτός. Δοκίμασε να δώσεις 2GB μνήμη στο virtual machine, γιατί 1GB ίσως είναι οριακό. Σχετικά με το ulimit, και γω unlimited τα χω.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...