עבודה עם קבצים ממופים זיכרון ב- .Net

גישה לקבצים היא פעולה עתירת משאבים. גישה לקובץ מהדיסק ליישום היא פעולה שלוקחת זמן, והגישה לנתונים מהזיכרון הראשי תמיד מהירה יותר. אז מה אם קבצי הדיסק שהיישום שלך צריך לקרוא או לכתוב אליהם ישנו בזיכרון? זה בדיוק המקום שבו המושג קבצים ממופים זיכרון משתלב. במאמר זה נחקור כיצד נוכל לעבוד עם קבצים הממופים זיכרון ב- .Net.

הצגת קבצים הממופים בזיכרון

קובץ ממופה זיכרון הוא אובייקט ליבה המשמש למיפוי קובץ בדיסק לאזור בזיכרון הראשי. לקבצים הממופים בזיכרון יכולים להיות רווחים משמעותיים בביצועים בהשוואה לגישה ישירה לדיסק בעבודה עם כמות גדולה של נתונים או תמונות גדולות. קבצים הממופים בזיכרון היו חלק מממשק ה- API של Win32, אך עד לאחרונה היית מוגבל לשימוש ב- C ++ או PInvoke כדי לכתוב קוד המנצל קבצים ממופים זיכרון ביישום שלך. עם זאת בעזרת .Net Framework 4 תוכלו כעת לעבוד עם קבצים הממופים בזיכרון ישירות מיישומי .Net שלכם - זמן הריצה מספק כעת עטיפה מנוהלת עם כל שיעורי העטיפה הדרושים להתקשרות ל- API של Win32. ה- MSDN קובע: "קובץ ממופה זיכרון מכיל את תוכן הקובץ בזיכרון הווירטואלי. מיפוי זה בין קובץ למרחב זיכרון מאפשר יישום, כולל מספר תהליכים,כדי לשנות את הקובץ על ידי קריאה וכתיבה ישירות לזיכרון. "

מדוע אתה זקוק לקבצים הממופים בזיכרון?

קבצים הממופים בזיכרון הם בחירה טובה כשאתה צריך לעבוד עם כמות גדולה של נתונים ותרצה להימנע מהעלות הכרוכה במריצה וביטול מרסח תוך שיתוף נתונים על גבולות התהליך. קבצים הממופים בזיכרון נהדרים בעיבוד קובץ גדול - קריאת קובץ גדול היא פעולה מקיפה. עם קבצים הממופים בזיכרון, אתה יכול למפות חלק מסוים מהקובץ שלך לזיכרון ולבצע פעולות קלט / פלט עם החסימה הזו כדי להאיץ את הגישה.

קובץ ממופה זיכרון מאפשר לך להזמין טווח של כתובת זיכרון ולהשתמש בקובץ דיסק כאחסון הפיזי של הכתובת השמורה. במילים אחרות, זה מאפשר לך לשמור מקום בזיכרון ואז לבצע אחסון פיזי לאזור זה. זה מאפשר לך לגשת לנתונים בדיסק ללא צורך לבצע פעולת קלט / פלט של קובץ. קבצים הממופים בזיכרון מאפשרים לך גם לשתף נתונים במספר תהליכים. מערכת ההפעלה דואגת לניהול זיכרון לקבצים הממופים בזיכרון - אינכם צריכים לטרוח כיצד מחלקים את הקובץ לדפים ומנוהלים. באפשרותך גם להחיל אבטחה בקובץ ממופה הזיכרון באמצעות ספירת MemoryMappedFileAccess כפרמטר בעת יצירת הקובץ הממופה לזיכרון. 

קבצי מיפוי זיכרון קבועים ולא מתמידים

למעשה ישנם שני סוגים של קבצים הממופים בזיכרון. אלו הם:

קבוע : קבצים ממופים של זיכרון קבועים הם אלה המשויכים לקובץ מקור בדיסק במערכת שלך. כאשר אתה עובד עם סוגים אלה של קבצי מיפוי זיכרון, הנתונים נשמרים בדיסק לאחר שהתהליך האחרון שעובד על הקובץ מסיים את פעילותו.

לא מתמיד : קבצים הממופים בזיכרון לא מתמידים הם אלה שאינם משויכים לקובץ דיסק. כשאתה עובד עם סוג זה של קבצים הממופים בזיכרון, הנתונים לא יישמרו לאחר שהתהליך האחרון שעבד על הקובץ סיים את עבודתו. קבצים ממופים של זיכרון לא מתמשכים נהדרים בשיתוף זיכרון לתקשורת בין תהליכים.

יצירת קבצים ממופים זיכרון מתמשך

כדי ליצור קובץ ממופה זיכרון מתמשך, עליך להשתמש בשיטת CreateFromFile של המחלקה MemoryMappedFile. המחלקה MemorymappedFile קיימת במרחב השמות System.IO.MemoryMappedFiles.

קטע הקוד הבא עושה שימוש בשיטת CreateFromFile ליצירת קובץ ממופה זיכרון. לאחר מכן הוא יוצר תצוגה ממופת זיכרון לחלק מהקובץ.

static long offset = 0x10000000; // 256 megabytes

static long length = 0x20000000; // 512 megabytes

        static void Main()

        {

            using (var memoryMappedFile = MemoryMappedFile.CreateFromFile("F:\\ImageData.png", FileMode.Open, "PartitionA"))

            {

                using (var accessor = memoryMappedFile.CreateViewAccessor(offset, length))

                {

                    //Other code

                }

            }

        } 

קטע הקוד הבא יראה כיצד ניתן לקרוא נתונים מקובץ ממופה זיכרון.

using (MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile("F:\\LargeData.dat"))

            {

                using (MemoryMappedViewStream memoryMappedViewStream = memoryMappedFile.CreateViewStream(0, 1204, MemoryMappedFileAccess.Read))

                {

                    var contentArray = new byte[1024];

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

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

                }

            }

יצירת קבצי מיפוי זיכרון שאינם מתמידים

כדי ליצור קבצים ממופים ללא זיכרון, כלומר, קבצים שאינם ממופים לקובץ קיים בדיסק, עליך למנף את השיטות CreateNew ו- CreateOrOpen.

קטע הקוד הבא ממחיש כיצד ניתן ליצור קובץ ממופה זיכרון שאינו מתמשך.

using(MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateNew("idg.txt", 5))

            {

                using(MemoryMappedViewAccessor memoryMappedViewAccessor = memoryMappedFile.CreateViewAccessor())

                {

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

                for (int i = 0; i < data.Length; i++)

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

                memoryMappedViewAccessor.Dispose();

                memoryMappedFile.Dispose();

                }

            }

תוכל לדעת יותר על קבצים הממופים בזיכרון ממאמר MSDN זה.