2011-12-20 19 views
9

मैं इस सरल कोड (एक 10 000 * 10 000 मैट्रिक्स) खुद से गुणा के लिए " 'System.OutOfMemoryException" अपवाद है:एक मैट्रिक्स के लिए स्मृति अपवाद से

#time 

#r "Microsoft.Office.Interop.Excel" 
#r "FSharp.PowerPack.dll" 

open System 
open System.IO 

open Microsoft.FSharp.Math 
open System.Collections.Generic 


let mutable Matrix1 = Matrix.create 10000 10000 0. 

let matrix4 = Matrix1 * Matrix1 

मैं निम्नलिखित त्रुटि है:

  1. मैं अपने कंप्यूटर पर एक 8 जीबी मेमोरी है और मेरे ग के अनुसार:

    System.OutOfMemoryException: An exception 'System.OutOfMemoryException' has been raised 
        Microsoft.FSharp.Collections.Array2DModule.ZeroCreate[T](Int32 length1, Int32 length2) 
        Microsoft.FSharp.Math.DoubleImpl.mulDenseMatrixDS(DenseMatrix`1 a, DenseMatrix`1 b) 
        Microsoft.FSharp.Math.SpecializedGenericImpl.mulM[a](Matrix`1 a, Matrix`1 b) 
        <StartupCode$FSI_0004>[email protected]() dans C:\Users\XXXXXXX\documents\visual studio 2010\Projects\Library1\Library1\Module1.fs:line 92 
    Stop due to an error 
    

    इसलिए मैं 2 प्रश्न हैं alculation एक 10 000 * 10 000 मैट्रिक्स 381 एमबी लेना चाहिए [इस तरह से गणना की: मैट्रिक्स में 10 000 * 10 000 = 100 000 000 पूर्णांकों =>100 000 000 * 4 bytes (integers of 32 bits) = 400 000 000 => 400 000 000/(1024*1024) = 381 MB] तो मैं नहीं समझ सकता क्यों है वहाँ एक OutOfMemoryException

  2. अधिक आम तौर पर (यह नहीं मामले यहाँ मुझे लगता है कि है), मेरे पास यह धारणा है कि एफ # इंटरैक्टिव सभी डेटा पंजीकृत करता है और इसलिए स्मृति को अधिभारित करता है, क्या आप F # से बाहर निकले बिना एफ # इंटरैक्टिव द्वारा पंजीकृत सभी डेटा को मुक्त करने के तरीके के बारे में जानते हैं?

+9

आपके मशीन में मनमाने ढंग से * मेमोरी * है; याद रखें, डिस्क स्पेस भी स्मृति है। रैम चिप्स डिस्क मेमोरी कैश करने के लिए बस एक तेज़ तरीका है। आपके पास 8 जीबी या .5 जीबी या 1000 जीबी भौतिक मेमोरी हो सकती है; यह पूरी तरह से अप्रासंगिक है। जिस स्मृति से आप बाहर चल रहे हैं वह * प्रति-प्रक्रिया वर्चुअल एड्रेस स्पेस * है, और इसका आपके पास कितना रैम या डिस्क स्पेस नहीं है। –

उत्तर

14

सारांश में, fsia 32-bit process है; अधिकतर इसमें 2 जीबी डेटा हो सकता है। 64-बिट विंडोज़ एप्लिकेशन के रूप में अपना परीक्षण चलाएं; आप मैट्रिक्स के आकार को बढ़ा सकते हैं, लेकिन इसमें अभी भी 2GB limit of .NET objects है।

मैं आपकी गणना को थोड़ा सा सही करता हूं। Matrix1 एक float matrix है, इसलिए प्रत्येक तत्व स्मृति में 8 बाइट्स पर कब्जा करता है।

2 * 10000 * 10000 * 8 = 1 600 000 000 bytes ~ 1.6 GB 

(matrix के कुछ बहीखाता भागों अनदेखी) तो यह कोई आश्चर्य की बात है जब इस मामले में स्मृति से बाहर fsi*32 रन: स्मृति में Matrix1 और matrix4 का कुल आकार कम से कम है।

64-बिट विंडोज़ प्रक्रिया के रूप में परीक्षण निष्पादित करें, आप float आकार के मैट्रिस 15000 के आसपास बना सकते हैं लेकिन उससे अधिक नहीं। विभिन्न प्रकार के मैट्रिक्स तत्वों के साथ ठोस संख्याओं के लिए this informative article देखें।

+0

यहां एक लेख है जो बताता है कि एफएसआई को 64 बिट प्रक्रिया के रूप में कैसे चलाया जाए: http://ig2600.blogspot.com/2010/05/making-fsharp-interpreter-fsi-run-in.html वैकल्पिक रूप से आप अपने एफ # कोड को संकलक कर सकते हैं और डिफ़ॉल्ट रूप से यह 64 बिट ओएस पर 64 बिट प्रक्रिया के रूप में चलाया जाएगा। – Robert

9

आपके कंप्यूटर पर भौतिक स्मृति की मात्रा प्रासंगिक टोंटी नहीं है - अधिक जानकारी के लिए Eric Lippert's great blog post देखते हैं।

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

  • कोई संबंधित समस्या नहीं^_^