Προγραμματισμός

Εργασία με αρχεία που έχουν αντιστοιχιστεί στη μνήμη στο .Net

Η πρόσβαση στο αρχείο είναι μια λειτουργία που απαιτεί πολλούς πόρους. Η πρόσβαση σε ένα αρχείο από το δίσκο για μια εφαρμογή είναι χρονοβόρα λειτουργία και η πρόσβαση σε δεδομένα από την κύρια μνήμη είναι πάντα ταχύτερη. Λοιπόν, τι γίνεται αν τα αρχεία δίσκου που χρειάζεται να διαβάσει ή να γράψει η εφαρμογή σας βρίσκονται στη μνήμη; Εδώ ακριβώς ταιριάζει η έννοια των αρχείων που έχουν αντιστοιχιστεί στη μνήμη. Σε αυτό το άρθρο, θα διερευνήσουμε πώς μπορούμε να εργαστούμε με αρχεία που έχουν αντιστοιχιστεί στη μνήμη.

Παρουσιάζουμε αρχεία που έχουν αντιστοιχιστεί στη μνήμη

Ένα αρχείο αντιστοίχισης μνήμης είναι ένα αντικείμενο πυρήνα που χρησιμοποιείται για την αντιστοίχιση ενός αρχείου στον δίσκο σας σε μια περιοχή στην κύρια μνήμη. Τα αρχεία που αντιστοιχίζονται στη μνήμη μπορούν να έχουν σημαντικά κέρδη απόδοσης σε σύγκριση με την άμεση πρόσβαση στο δίσκο όταν εργάζεστε με μεγάλο αριθμό δεδομένων ή μεγάλες εικόνες. Τα αρχεία που αντιστοιχίζονται στη μνήμη αποτελούν μέρος του Win32 API, αλλά μέχρι πρόσφατα, περιορίσατε να χρησιμοποιήσετε το C ++ ή το PInvoke για να γράψετε κώδικα που αξιοποιεί τα αρχεία που έχουν αντιστοιχιστεί στη μνήμη της εφαρμογής σας. Ωστόσο, με το .Net Framework 4 μπορείτε πλέον να εργαστείτε με αρχεία που έχουν αντιστοιχιστεί στη μνήμη απευθείας από τις εφαρμογές σας .Net - ο χρόνος εκτέλεσης σας παρέχει τώρα ένα διαχειριζόμενο περιτύλιγμα με όλες τις απαραίτητες τάξεις περιτυλίγματος για να καλέσετε το API Win32 Το MSDN δηλώνει: "Ένα αρχείο που αντιστοιχεί στη μνήμη περιέχει τα περιεχόμενα ενός αρχείου στην εικονική μνήμη. Αυτή η αντιστοίχιση μεταξύ ενός αρχείου και ενός χώρου μνήμης επιτρέπει σε μια εφαρμογή, συμπεριλαμβανομένων πολλών διαδικασιών, να τροποποιεί το αρχείο διαβάζοντας και γράφοντας απευθείας στη μνήμη."

Γιατί χρειάζεστε αρχεία που έχουν αντιστοιχιστεί στη μνήμη;

Τα αρχεία που έχουν αντιστοιχιστεί στη μνήμη είναι μια καλή επιλογή όταν πρέπει να εργαστείτε με μεγάλο αριθμό δεδομένων και θα θέλατε να αποφύγετε το κόστος που σχετίζεται με τη συλλογή και την αποσυμπίεση ενώ μοιράζεστε δεδομένα πέρα ​​από τα όρια της διαδικασίας. Τα αρχεία που έχουν αντιστοιχιστεί στη μνήμη είναι εξαιρετικά στην επεξεργασία ενός μεγάλου αρχείου - η ανάγνωση ενός μεγάλου αρχείου είναι μια εκτεταμένη λειτουργία πόρων. Με αρχεία που αντιστοιχίζονται στη μνήμη, μπορείτε να αντιστοιχίσετε ένα συγκεκριμένο τμήμα του αρχείου σας στη μνήμη και να εκτελέσετε λειτουργίες εισόδου / εξόδου με αυτό το μπλοκ για να επιταχύνετε την πρόσβαση.

Ένα αρχείο χαρτογράφησης μνήμης σάς επιτρέπει να δεσμεύσετε ένα εύρος διεύθυνσης μνήμης και να χρησιμοποιήσετε ένα αρχείο δίσκου ως τη φυσική αποθήκευση για την δεσμευμένη διεύθυνση. Με άλλα λόγια, σας επιτρέπει να διατηρήσετε χώρο στη μνήμη και, στη συνέχεια, να πραγματοποιήσετε φυσική αποθήκευση σε αυτήν την περιοχή. Αυτό σας επιτρέπει να έχετε πρόσβαση σε δεδομένα στο δίσκο χωρίς να χρειάζεται να εκτελέσετε τη λειτουργία I / O του αρχείου. Τα αρχεία που αντιστοιχίζονται στη μνήμη σάς επιτρέπουν επίσης να μοιράζεστε δεδομένα σε πολλές διαδικασίες. Το Λειτουργικό Σύστημα φροντίζει τη διαχείριση της μνήμης για αρχεία που έχουν αντιστοιχιστεί στη μνήμη - δεν χρειάζεται να ανησυχείτε για τον τρόπο κατάτμησης και διαχείρισης του αρχείου. Μπορείτε επίσης να εφαρμόσετε ασφάλεια στο αρχείο που έχει αντιστοιχιστεί στη μνήμη χρησιμοποιώντας τον απαρίθμηση MemoryMappedFileAccess ως παράμετρο κατά τη δημιουργία του αρχείου που αντιστοιχεί στη μνήμη.

Μόνιμα και μη μόνιμα αρχεία που αντιστοιχίζονται στη μνήμη

Υπάρχουν ουσιαστικά δύο τύποι αρχείων που αντιστοιχίζονται στη μνήμη. Αυτά είναι:

Επίμονος: Τα μόνιμα αρχεία που αντιστοιχίζονται στη μνήμη είναι εκείνα που σχετίζονται με ένα αρχείο προέλευσης στο δίσκο του συστήματός σας. Όταν εργάζεστε με αυτούς τους τύπους αρχείων που αντιστοιχίζονται στη μνήμη, τα δεδομένα παραμένουν στον δίσκο μετά την ολοκλήρωση της δραστηριότητας της τελευταίας διαδικασίας που εργάζεται στο αρχείο.

Μη ανθεκτικό: Τα αρχεία που δεν αντιστοιχούν στη μνήμη είναι εκείνα που δεν σχετίζονται με ένα αρχείο δίσκου. Όταν εργάζεστε με αυτόν τον τύπο αρχείων που αντιστοιχίζονται στη μνήμη, τα δεδομένα δεν διατηρούνται μετά την ολοκλήρωση της εργασίας της τελευταίας διαδικασίας στο αρχείο. Τα μη μόνιμα αρχεία χαρτογράφησης μνήμης είναι εξαιρετικά στην κοινή χρήση μνήμης για επικοινωνίες μεταξύ διεργασιών.

Δημιουργία αρχείων αντιστοίχισης μόνιμης μνήμης

Για να δημιουργήσετε ένα αρχείο αντιστοίχισης μόνιμης μνήμης, πρέπει να χρησιμοποιήσετε τη μέθοδο CreateFromFile της κλάσης MemoryMappedFile. Η κλάση MemorymappedFile υπάρχει στο χώρο ονομάτων System.IO.MemoryMappedFiles.

Το ακόλουθο απόσπασμα κώδικα χρησιμοποιεί τη μέθοδο CreateFromFile για τη δημιουργία ενός αρχείου που αντιστοιχεί στη μνήμη. Στη συνέχεια δημιουργεί μια προβολή χαρτογραφημένης μνήμης σε ένα τμήμα του αρχείου.

στατική μακρά μετατόπιση = 0x10000000; // 256 megabyte

στατικό μήκος = 0x20000000; // 512 megabyte

στατικό κενό Κεντρικό ()

        {

χρησιμοποιώντας (var memoryMappedFile = MemoryMappedFile.CreateFromFile ("F: \ ImageData.png", FileMode.Open, "PartitionA"))

            {

χρήση (var accessor = memoryMappedFile.CreateViewAccessor (μετατόπιση, μήκος))

                {

// Άλλος κωδικός

                }

            }

        } 

Το απόσπασμα κώδικα που δίνεται στη συνέχεια δείχνει πώς μπορείτε να διαβάσετε δεδομένα από ένα αρχείο που έχει αντιστοιχιστεί στη μνήμη.

χρησιμοποιώντας (MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile ("F: \ LargeData.dat"))

            {

χρησιμοποιώντας (MemoryMappedViewStream memoryMappedViewStream = memoryMappedFile.CreateViewStream (0, 1204, MemoryMappedFileAccess.Read))

                {

var contentArray = νέο byte [1024];

memoryMappedViewStream.Read (contentArray, 0, contentArray.Length);

string content = Encoding.UTF8.GetString (contentArray);

                }

            }

Δημιουργία αρχείων που δεν αντιστοιχούν στη μνήμη

Για να δημιουργήσετε αρχεία που δεν αντιστοιχούν στη μνήμη, δηλαδή αρχεία που δεν αντιστοιχίζονται σε υπάρχον αρχείο στο δίσκο, πρέπει να αξιοποιήσετε τις μεθόδους CreateNew και CreateOrOpen.

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

χρησιμοποιώντας (MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateNew ("idg.txt", 5))

            {

χρησιμοποιώντας (MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor ())

                {

var data = new [] {(byte) "I", (byte) "D", (byte) "G"};

για (int i = 0; i <data.Length; i ++)

memoryMappedViewAccessor.Write (i, data [i]);

memoryMappedViewAccessor.Dispose ();

memoryMappedFile.Dispose ();

                }

            }

Μπορείτε να μάθετε περισσότερα σχετικά με τα αρχεία που έχουν αντιστοιχιστεί στη μνήμη από αυτό το άρθρο του MSDN.

$config[zx-auto] not found$config[zx-overlay] not found