2012-01-01 28 views
26

मैं ऐसे कोड की तलाश नहीं कर रहा हूं जो कमांड लाइन उपयोगिता को आमंत्रित करे, जो चाल करता है। मैं वास्तव में एक राम डिस्क बनाने के लिए इस्तेमाल एपीआई जानने में दिलचस्पी है।मैं रैम डिस्क प्रोग्रामेटिक रूप से कैसे बना सकता हूं?

धन्यवाद।

संपादित

प्रेरणा: मैं जो आदेश एक निश्चित तरीके से कि निर्देशिका में फ़ाइलों को प्रोसेस करने में एक निर्देशिका के नाम को उम्मीद है एक तीसरी पार्टी पुस्तकालय है। मेरे पास इन फ़ाइलों को एक संग्रह में ज़िपित किया गया है। मैं संग्रह को रैम डिस्क में निकालना चाहता हूं और तीसरे पक्ष को उस रैम डिस्क पर संबंधित निर्देशिका के पथ को पास करना चाहता हूं। जैसा कि आप देख सकते हैं, मेमोरी मैप की गई फाइलें मेरे लिए उपयोग नहीं हैं

+1

यदि आप वास्तव में राम * डिस्क * पर विचार करते हैं, तो विंडोज़ में ऐसा कोई 'CreateRAMDisk' फ़ंक्शन नहीं है। मुझे लगता है कि आपको डिस्क के लिए ड्राइवर बनाने का तरीका देखना है, लेकिन डिस्क को रैम पर रीडायरेक्ट किया गया है। हालांकि, अगर आप फ़ाइलों को स्मृति में रीडायरेक्ट करना चाहते हैं, तो स्मृति-मैप की गई फ़ाइल का उपयोग करना कार्य करेगा। – minjang

+0

मैंने अपना प्रश्न संपादित किया। – mark

+0

संभावित डुप्लिकेट [प्रोग्राम करने योग्य रैम डिस्क एपीआई के लिए .NET?] (Http://stackoverflow.com/questions/2402888/programmable-ram-disk-api-for-net) –

उत्तर

1

वहाँ एक रैम डिस्क से प्रति बनाने के लिए कोई एपीआई है। आपको अपना डिवाइस ड्राइवर लिखना होगा जो सिस्टम में एक नई डिस्क प्रस्तुत करता है, और उस डिवाइस ड्राइवर को आवंटित स्मृति के साथ काम करता है।

संपादित करें (ओ पी के संपादन के बाद)

आपको बस इतना करना सामान्य रूप से 'temp' निर्देशिका है, जो सबसे तेजी से सिस्टम में उपलब्ध डिस्क पर निवास माना जाता है का उपयोग किया जा जाएगा कोशिश कर रहे हैं। तो, एक प्रणाली जिसमें पहले से ही रैमडिस्क है, में शायद इसका अस्थायी पर्यावरण चर पहले से ही रैमडिस्क पर एक फ़ोल्डर को इंगित करने के लिए सेट हो जाएगा, और रैमडिस्क के बिना सिस्टम केवल प्रदर्शन जुर्माना लेगा, यह उनकी समस्या है।

अब, अगर किसी कारण से आप किसी सिस्टम पर रैमडिस्क की उपस्थिति पर भरोसा नहीं कर सकते हैं, और आपको बिल्कुल सबसे तेज़ प्रदर्शन की आवश्यकता है, तो मुझे कोई तृतीय पक्ष स्थापित करने के लिए कोई विकल्प नहीं दिख रहा है (शायद स्वतंत्र रूप से डाउनलोड करने योग्य, शायद यहां तक ​​कि खुला स्रोत) रैम डिस्क, अस्थायी रूप से इसका उपयोग करें, और उसके बाद इसे अनइंस्टॉल करें। लेकिन यह बहुत गुंजाइश है।

+11

"अपना खुद का डिवाइस ड्राइवर लिखें" मेरी राय में "लगभग असंभव" का पर्याय बन गया है ... – mark

+3

हां, मुझे लगता है कि पूरे ग्रह पर लोग जो इस तरह के एक कार्य को आरामदायक तरीके से उपक्रम करेंगे, शायद एक कमरे में फिट हो। –

+1

यह विषय कब तक जीवित रहेगा? रैमडिस्क का पुनरुत्थान -> एसएसडी .. – Karel

6

आप भाषा उल्लेख फ्लॉप, तो मेरा उत्तर सी # में है:

एक स्मृति-मैप की गई फ़ाइल आभासी स्मृति में एक फ़ाइल की सामग्री में शामिल है। फ़ाइल और मेमोरी स्पेस के बीच यह मैपिंग फ़ाइल को संशोधित और सीधे लिखकर फ़ाइल को संशोधित करने के लिए एकाधिक प्रक्रियाओं सहित एक एप्लिकेशन को सक्षम बनाता है। .NET Framework संस्करण 4 से शुरू करने से, आप एमएसडीएन लाइब्रेरी में Win32 में मेमोरी-मैप की गई फ़ाइलों को प्रबंधित करने में वर्णित अनुसार मेमोरी-मैप की गई फ़ाइलों तक पहुंचने के लिए प्रबंधित कोड का उपयोग कर सकते हैं।

http://msdn.microsoft.com/en-us/library/dd997372.aspx

MemoryMappedFile MemoryMapped = MemoryMappedFile.CreateOrOpen(
     new FileStream(@"C:\temp\Map.mp", FileMode.Create), // Any stream will do it  
     "MyMemMapFile",          // Name 
     1024 * 1024,          // Size in bytes 
     MemoryMappedFileAccess.ReadWrite);     // Access type 

// मानचित्र दृश्य बना सकते हैं और इसे पढ़ा:

using (MemoryMappedViewAccessor FileMap = MemoryMapped.CreateViewAccessor()) 
{ 
     Container NewContainer = new Container(); 
     FileMap.Read<Container>(4, out NewContainer); 
} 
+9

यह एक मेमोरी मैप की गई फ़ाइल है। यह एक राम डिस्क नहीं है। –

+0

@ माइकनाकिस 'गैर-जारी स्मृति-मैप की गई फ़ाइलें' और 'जारी स्मृति-मैप की गई फ़ाइलें' http: // msdn हैं।microsoft.com/en-us/library/dd997372.aspx –

+0

@ माइकनाकिस 'गैर-स्थिर फ़ाइलें स्मृति-मैप की गई फ़ाइलें हैं जो डिस्क पर फ़ाइल से संबद्ध नहीं हैं। –

27

ImDisk एक रैम डिस्क ऐप है जो स्मृति के क्षेत्र से वर्चुअल ड्राइव बनाता है, और इसमें एक एपीआई है जिसे .NET से बुलाया जा सकता है।

class RamDisk 
{ 
    public const string MountPoint = "X:"; 

    public void createRamDisk() 
    { 

     try 
     { 
      string initializeDisk = "imdisk -a "; 
      string imdiskSize  = "-s 1024M "; 
      string mountPoint  = "-m "+ MountPoint + " "; 


      ProcessStartInfo procStartInfo = new ProcessStartInfo(); 
      procStartInfo.UseShellExecute = false; 
      procStartInfo.CreateNoWindow = true; 
      procStartInfo.FileName   = "cmd"; 
      procStartInfo.Arguments   = "/C " + initializeDisk + imdiskSize + mountPoint; 
      Process.Start(procStartInfo); 

      formatRAMDisk(); 

     } 
     catch (Exception objException) 
     { 
      Console.WriteLine("There was an Error, while trying to create a ramdisk! Do you have imdisk installed?"); 
      Console.WriteLine(objException); 
     } 

    } 

    /** 
    * since the format option with imdisk doesn't seem to work 
    * use the fomat X: command via cmd 
    * 
    * as I would say in german: 
    * "Von hinten durch die Brust ins Auge" 
    * **/ 
    private void formatRAMDisk(){ 

     string cmdFormatHDD = "format " + MountPoint + "/Q /FS:NTFS"; 

     SecureString password = new SecureString(); 
     password.AppendChar('0'); 
     password.AppendChar('8'); 
     password.AppendChar('1'); 
     password.AppendChar('5'); 

     ProcessStartInfo formatRAMDiskProcess = new ProcessStartInfo(); 
     formatRAMDiskProcess.UseShellExecute = false; 
     formatRAMDiskProcess.CreateNoWindow  = true; 
     formatRAMDiskProcess.RedirectStandardInput  = true; 
     formatRAMDiskProcess.FileName   = "cmd"; 
     formatRAMDiskProcess.Verb    = "runas"; 
     formatRAMDiskProcess.UserName   = "Administrator"; 
     formatRAMDiskProcess.Password   = password; 
     formatRAMDiskProcess.Arguments   = "/C " + cmdFormatHDD; 
     Process process       = Process.Start(formatRAMDiskProcess); 

     sendCMDInput(process); 
    } 

    private void sendCMDInput(Process process) 
    { 
     StreamWriter inputWriter = process.StandardInput; 
     inputWriter.WriteLine("J"); 
     inputWriter.Flush(); 
     inputWriter.WriteLine("RAMDisk for valueable data"); 
     inputWriter.Flush(); 
    } 

    public string getMountPoint() 
    { 
     return MountPoint; 
    } 
} 
+0

उत्कृष्ट उपकरण! –

+3

'आईएमडीस्क' और 'सॉफ्टफेक्ट रैम डिस्क' दोनों की कोशिश करने के बाद, मैं 'सॉफ्टफेरफेक्ट' पसंद करता हूं। इसमें बेहतर प्रदर्शन था, केवल 100 एमबी आवंटित 0.2 एमबी आरक्षित, 'आईएमडीस्क 'के लिए 10 एमबी बनाम, और' उपयोगकर्ता 'की आवश्यकता नहीं थी ड्राइव नियंत्रण माउंट करने के लिए खाता नियंत्रण (यूएसी) 'संकेत। दोनों एक सतत विकल्प का समर्थन करते हैं, लेकिन मैंने इसका परीक्षण किया। – Loathing

संबंधित मुद्दे

 संबंधित मुद्दे