Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα με malloc μεγάλων data blocks.

Îåêßíçóå áðü ôï ìÝëïò DarthMoul. Τελευταία δημοσίευση από το μέλος ilias στις 21-02-2007, 11:21. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-01-2007, 20:11 23337

    Πρόβλημα με malloc μεγάλων data blocks.

    Καλησπερίζω την παρέα των developers. Θα ήθελα να κάνω δύο ερωτησούλες για κάτι προβληματάκια που έχω με ένα Visual C project:
    1) Όταν κάνω malloc μεγάλα data blocks, μεγαλύτερα από 512 MB, η malloc σκάει και επιστρέφει NULL. Υπάρχει κάποιος τρόπος να αυξήσω τα όρια της;
    2) Υπάρχει τρόπος να δημιουργήσω installer για το πρόγραμμα μου μέσα από το Visual Studio, ή χρειάζεται να χρησιμοποιήσω κάποιο άλλο tool

    Χρησιμοποιώ Visual Studio Express 2005 και Win32 Plarform SDK. Ο κώδικας μου είναι σε C (όχι C++)

    Κάθε βοήθεια ευπρόσδεκτη. Ευχαριστώ εκ των προτέρων.


  •  10-01-2007, 22:24 23341 σε απάντηση της 23337

    Απ: Πρόβλημα με malloc μεγάλων data blocks.

    Μπορείς πάντα να χρησιμοποιήσεις τα Win32 APIs για διαχείριση μνήμης (VirtualAlloc κλπ). Δεδομένου όμως ότι τα user mode addresses έχουν 2GB διαθέσιμα, άντε 3GB με τα memory extensions, περπατάς σε τεντωμένο σχοινί. Μήπως θα μπορούσες να εξετάσεις εναλλακτικές μεθόδους, π.χ. memory mapped files;

    Νατάσα Μανουσοπούλου
  •  11-01-2007, 07:55 23356 σε απάντηση της 23337

    Απ: Πρόβλημα με malloc μεγάλων data blocks.

    Νατάσα σ'ευχαριστώ για την γρήγορη απάντηση. Επειδή ελέγχω το μέγεθος της φυσικής μνήμης καθώς και την χρήση της πριν από το malloc δεν υπάρχει ο κίνδυνος που λες. Το δε memory mapping που προτείνεις δεν αποτελεί λύση στην περίπτωση μου για δύο λόγους. Πρώτον, το πρόγραμμα θα πρέπει να είναι γρήγορο και η ανεξέλεγκτη χρήση του δίσκου από το λειτουργικό δεν είναι επιλογή και δεύτερον, το memory mapping υπόκειται και αυτό στους περιορισμούς του Virtual Address Space που μπορεί να χειριστεί το λειτουργικό. Επίσης το memory mapping θα υποστεί και τους περιορισμούς του file system σε περίπτωση που αυτό τύχει να είναι fat32.

    Η VirtualAlloc φαίνεται να μου κάνει. Να είσαι καλά Smile
  •  11-01-2007, 11:06 23359 σε απάντηση της 23341

    Απ: Πρόβλημα με malloc μεγάλων data blocks.

    Ταχύτητα και blocks των 512 ΜΒ? Λόγω του swapping θα έχεις το penalty των memory mapped files χωρίς το όφελος. Εξάλλου, και η VirualAlloc θα έχει τους περιορισμούς του λειτουργικού. Άσε, που για να σου καθαρίσει 512 ΜΒ μνήμη το οποιοδήποτε function θα πρέπει να κάνει το ίδιο swap άλλες σελίδες.

    Σκέψου πάντως, ότι τόση πολύ μνήμη χρησιμοποιούν συνήθως μεγάλοι database servers. Μήπως υπάρχουν ευκολότεροι τρόποι να κάνεις αυτό που θέλεις, χωρίς να πιάνεις εκ των προτέρων τόση μνήμη?
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  11-01-2007, 11:25 23361 σε απάντηση της 23337

    Απ: Πρόβλημα με malloc μεγάλων data blocks.

    Έχω την εντύπωση ότι η μνήμη, ακόμα και με blocks των 512 MB και cache efficient κώδικα, θα είναι πιο γρήγορη από τον δίσκο. Και ελέγχοντας την διαθέσιμη RAM και την χρήση της μπορώ να καθορίσω το μέγιστο μέγεθος που μπορώ να κάνω malloc χωρίς να προκαλέσω swapping. Το πρόβλημα μου είναι πως όταν τελικά έχω διαθέσιμη μνήμη πάνω από 512 MB και μπορώ να κάνω το malloc με ασφάλεια χωρίς να προκαλέσω swapping, η malloc σκάει, οπότε θα δοκιμάσω την VirtuallAlloc που μου είπε η Νατάσσα.

    Το πρόγραμμα που δουλεύω είναι cross platform και η δουλειά του είναι να κάνει data manipulation από data sets δεκάδων ή και εκατοντάδων εκατομμυρίων records (FLR ή VLR με μεταβλητό αριθμό πεδίων fixed ή delimited) και multithread sort/merge, input reformating εάν χρειάζεται και έχει σχεδιαστεί έτσι ώστε να κάνει και cross-platform distribution στο μέλλον. Στα unix λειτουργικά την malloc την βόλεψα με μια setrlimit αλλά στα windows μόλις περνάω τα 512 MB τρώω πόρτα. Η brk/sbrk family functions δεν είδα να παίζουν πουθενά στα windows και τελικά κατέφυγα εδώ για να βρω την πλέον δόκιμη λύση για το πρόβλημα μου.
  •  21-02-2007, 11:21 25255 σε απάντηση της 23361

    Απ: Πρόβλημα με malloc μεγάλων data blocks.

    Κάποιες μικρές διορθώσεις:
    1)Η malloc, όπως και η VirtualAlloc κάνουν allocate virtual μνήμη και όχι φυσική μνήμη. Επομένως, η RAM δεν έχει καμία σχέση.
    2)Αν χρησιμοποιήσεις memory mapped files, τότε πάλι ο cache manager σε συνεργασία με το memory manager θα φροντίσουν, ώστε τα δεδομένα που χρειάζεσαι να βρίσκονται στη μνήμη (βλ. και τον prefetcher, γνωστό και ως Windows Superfetch στα Windows Vista). Δε θα τα διαβάζεις απευθείας απ'το δίσκο.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems