ईएसआरआई समर्थन का कहना है कि उन्होंने इस मुद्दे को फिर से तैयार किया है और एक बग रिपोर्ट (NIM070156) खोली है।
मैंने निर्धारित किया है कि एक स्मृति रिसाव है (अप्रबंधित हीप मेमोरी में) जो तब होता है जब मेरे .NET / C # ArcMap में एक उपकरण एक स्थानिक क्वेरी को करता है ( एक क्वेरी फ़िल्टर के साथ एक ICursor
से लौटता है )। सभी COM ऑब्जेक्ट को जल्द से जल्द रिलीज़ किया जा रहा है, जिनकी अब आवश्यकता नहीं है (उपयोग करते हुए )।IFeatureClass.Search
ISpatialFilter
Marshal.FinalReleaseCOMObject
यह निर्धारित करने के लिए, मैंने पहली बार ArcMap.exe के प्राइवेट बाइट्स, वर्चुअल बाइट्स और वर्किंग सेट के लिए काउंटरों के साथ एक परफ़ॉर्मन सत्र की स्थापना की और नोट किया कि क्वेरी को निष्पादित करने वाले टूल के प्रत्येक उपयोग के साथ तीनों में लगातार वृद्धि हुई (लगभग 500KB प्रति पुनरावृत्ति)। । गंभीर रूप से, यह केवल तब होता है जब प्रत्यक्ष कनेक्ट (ST_Geometry स्टोरेज, ओरेकल 11 जी क्लाइंट और सर्वर) का उपयोग करके एसडीई पर फीचर कक्षाओं के खिलाफ प्रदर्शन किया जाता है । फ़ाइल जियोडेटाबेस का उपयोग करते समय काउंटर स्थिर रहे, साथ ही साथ एक पुराने एसडीई उदाहरण से कनेक्ट करना जो एप्लिकेशन कनेक्ट का उपयोग करता है।
मैंने तब LeakDiag और LDGrapher (इस ब्लॉग पोस्ट के कुछ मार्गदर्शन के साथ ) का उपयोग किया और तीन बार में विंडोज हीप एलोकैटर को लॉग इन किया: जब मैंने आर्कप को पहली बार लोड किया और टूल को एक दो बार चलाने के बाद, और इसे चलाने के बाद इसे इनिशियलाइज़ करने के लिए टूल का चयन किया यह कुछ और दर्जन बार है।
यहाँ परिणाम हैं जैसा कि LDGrapher के डिफ़ॉल्ट दृश्य (कुल आकार) में दिखाया गया है:
यहाँ लाल रेखा के लिए कॉल स्टैक है:
जैसा कि आप देख सकते हैं कि SgsShapeFindRelation2
फ़ंक्शन sg.dll में प्रतीत होता है कि मेमोरी लीक के लिए क्या जिम्मेदार है।
जैसा कि मैं समझता हूं कि sg.dll आर्कोबजेक्ट द्वारा उपयोग की जाने वाली कोर ज्योमेट्री लाइब्रेरी है, और SgsShapeFindRelation2
संभवतया जहां स्थानिक फ़िल्टर लागू किया जा रहा है।
इससे पहले कि मैं कुछ और करूं, मैं सिर्फ यह देखना चाहता था कि क्या कोई और इस मुद्दे (या कुछ इसी तरह) में भाग गया था और अगर वे इसके बारे में कुछ भी करने में सक्षम थे तो क्या होगा। इसके अलावा क्या हो सकता है केवल सीधे कनेक्ट के साथ ऐसा होने का कारण? क्या यह ध्वनि आर्कोबजेक्ट्स, एक कॉन्फ़िगरेशन समस्या, या एक प्रोग्रामिंग समस्या में बग की तरह है?
यहां इस पद्धति का एक न्यूनतम कार्यशील संस्करण है जो इस व्यवहार का निर्माण करता है:
private string GetValueAtPoint(IPoint pPoint, IFeatureClass pFeatureClass, string pFieldName)
{
string results = "";
ISpatialFilter pSpatialFilter = null;
ICursor pCursor = null;
IRow pRow = null;
try
{
pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = pPoint;
pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
pSpatialFilter.SearchOrder = esriSearchOrder.esriSearchOrderSpatial;
pCursor = (ICursor)pFeatureClass.Search(pSpatialFilter, false);
pRow = pCursor.NextRow();
if (pRow != null)
results = pRow.get_Value(pFeatureClass.FindField(pFieldName)).ToString();
}
finally
{
// Explicitly release COM objects
if (pRow != null)
Marshal.FinalReleaseComObject(pRow);
if (pCursor != null)
Marshal.FinalReleaseComObject(pCursor);
if (pSpatialFilter != null)
Marshal.FinalReleaseComObject(pSpatialFilter);
}
return results;
}
रागी के साथ नीचे चर्चा पर आधारित मेरा वर्कअराउंड कोड यहां दिया गया है:
private bool PointIntersectsFeature(IPoint pPoint, IFeature pFeature)
{
bool returnVal = false;
ITopologicalOperator pTopoOp = null;
IGeometry pGeom = null;
try
{
pTopoOp = ((IClone)pPoint).Clone() as ITopologicalOperator;
if (pTopoOp != null)
{
pGeom = pTopoOp.Intersect(pFeature.Shape, esriGeometryDimension.esriGeometry0Dimension);
if (pGeom != null && !(pGeom.IsEmpty))
returnVal = true;
}
}
finally
{
// Explicitly release COM objects
if (pGeom != null)
Marshal.FinalReleaseComObject(pGeom);
if (pTopoOp != null)
Marshal.FinalReleaseComObject(pTopoOp);
}
return returnVal;
}
private string GetValueAtPoint(IPoint pPoint, IFeatureClass pFeatureClass, string pFieldName)
{
string results = "";
ISpatialFilter pSpatialFilter = null;
IFeatureCursor pFeatureCursor = null;
IFeature pFeature = null;
try
{
pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = pPoint;
pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelEnvelopeIntersects;
pFeatureCursor = pFeatureClass.Search(pSpatialFilter, true);
pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
if (PointIntersectsFeature(pPoint, pFeature))
{
results = pFeature.get_Value(pFeatureClass.FindField(pFieldName)).ToString();
break;
}
pFeature = pFeatureCursor.NextFeature();
}
}
finally
{
// Explicitly release COM objects
if (pFeature != null)
Marshal.FinalReleaseComObject(pFeature);
if (pFeatureCursor != null)
Marshal.FinalReleaseComObject(pFeatureCursor);
if (pSpatialFilter != null)
Marshal.FinalReleaseComObject(pSpatialFilter);
}
return results;
}